タブで区切られた各行の 3 番目の単語を翻訳するスクリプトを書くのを手伝ってくれませんか。
サンプル入力:
Hello how Are You
Iam Fine how about
出力例:
Hello how Ziv You
Iam Fine sld about
各行の 3 番目の単語は、次のように翻訳する必要があります。tr '[abcdefghijklmnopqrstuvqxyz]' '[zyxwvutsrqponmlkjihgfedcba]'
バッシュするだけです:
#!/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
これは非常に厄介ですが、仕事は完了します (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
このような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
}
perl -F'\t' -lane '$F[3] =~ tr/ABCDEFGHIJKLMNOPQRSTUVQXYZabcdefghijklmnopqrstuvqxyz/ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba/ ; print "@F"' Filename