3

タブで区切られた各行の 3 番目の単語を翻訳するスクリプトを書くのを手伝ってくれませんか。

サンプル入力:

Hello how Are You
Iam Fine how about

出力例:

Hello how Ziv You
Iam Fine sld about

各行の 3 番目の単語は、次のように翻訳する必要があります。tr '[abcdefghijklmnopqrstuvqxyz]' '[zyxwvutsrqponmlkjihgfedcba]'

4

5 に答える 5

2

バッシュするだけです:

#!/bin/bash
while read -ra A; do
    printf "%s\t%s" "${A[0]}" "${A[1]}"
    printf "\t%s" "$(echo "${A[2]}" | tr '[ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz]' '[ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba]')" "${A[@]:3}"
    echo
done

次のように実行します。

bash script.sh < input_file

出力:

Hello   how     Aiv     You
Iam     Fine    slw     about

\tスペース ( )に変更した場合:

Hello how Ziv You
Iam Fine slw about

別のバージョン:

#!/bin/bash
F=({A..Z} {a..z}) R=({Z..A} {z..a})
while read -ra A; do
    printf "%s\t%s" "${A[0]}" "${A[1]}"
    printf "\t%s" "$(IFS=''; echo "${A[2]}" | tr "[${F[*]}]" "[${R[*]}]")" "${A[@]:3}"
    echo
done
于 2013-09-24T01:49:19.313 に答える
1

これは非常に厄介ですが、仕事は完了します (bash シェルで)。入力ファイル全体でsed のy音訳演算子を使用します。これは、プロセス置換を介して awk に渡され、3 番目のフィールドが配列に格納されます。次に、awk は元のファイルをループし、3 番目のフィールドの各インスタンスを音訳された値に置き換えます。

awk -F'\t'  -v OFS='\t' 'NR == FNR{a[NR]=$3; next};{$3=a[FNR]; print}' \
<(sed -e 'y/abcdefghijklmnopqrstuvqxyz/zyxwvutsrqponmlkjihgfedcba/' \
-e 'y/ABCDEFGHIJKLMNOPQRSTUVQXYZ/ZYXWVUTSRQPONMLKJIHGFEDCBA/' file) file
于 2013-09-24T01:46:50.287 に答える
1

このようなAWKスクリプト

#!/usr/bin/awk -f
BEGIN{
    IFS="\t"                                        #input field separator as tab
    CHARSET = "abcdefghijklmnopqrstuvwxyz"      
}

{
    rep_str=""                                      #replacement string
    # loop in through each char of third word
    for(i=1;i<=length($3);i++){
        char = substr($3,i,1)
        loc = index(CHARSET,tolower(char))

        #check to see if the character is actually an alphabet
        if(loc>0){

            #get the reverse location of char in the CHARSET                               
            rep_char = substr(CHARSET,27-loc,1)    

            #change the replacement character to upper case if the original char is uppercase
            if(char~/[A-Z]/){
                rep_char = toupper(rep_char)   
            }
        }else{
            rep_char = char
        }
        rep_str=rep_str rep_char                       #final replacement sting formed by concatenation of replaced char rep_char 
    }
    $3 = rep_str                                           
    print $0    
}
于 2013-09-25T12:57:41.977 に答える
0
perl -F'\t' -lane '$F[3] =~ tr/ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz/ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba/ ; print "@F"' Filename
于 2013-09-24T07:28:31.750 に答える