2012-03-27 9 views
7

私はプログラミング言語を使用しています。 awkを使ってすべての行とファイル内のすべての単語を逆にする必要があります。awkは両方の行と単語を逆順にします。

"ファイル1" は逆にする:

のAA BB CCの

fooが

そして、 "ファイル1" の出力印刷のようにしてください。このようになります。

as foo

のccのBB AA

私は、各行に逆単語のためにこれを試してみました:

for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)

が、私は逆にラインを印刷したい場合、私はこの

{a[NR]=$0 
}END{for(i=NR; i; i--) print a[i]} 

をしなければなりませんターミナルでこのコマンドを使用して2つのファイルを処理する必要があります。

awk -f commandFile FileToBePrinted 

問題は私がこのすべてで初心者であり、それらの2つをどのように組み合わせるのか分からないことです。 ありがとう!

+0

+1もよく表示されます。良い書式設定、サンプル入力、サンプル出力、および動作していないコード!良いショーと投稿を続ける! – shellter

答えて

3

ケヴのソリューションは、各単語のテキストを逆に見えます。あなたの出力例はそれを示していませんが、彼の重要なポイントは関数を使うことです。

必要なコードがありますが、少し並べ替えるだけです。

cat file1 
aa bb cc 
foo do as 

cat commandFile 

function reverse(line) { 
    n=split(line, tmpLine) 
    for (j=n; j>0; j--) { 
    printf("%s ",tmpLine[j]) 
    } 

} 
# main loop 
{ a[NR]=$0 } 

# print reversed array 
END{ for(i=NR; i>0; i--) printf("%s\n", reverse(a[i])) } 

実行

awk -f commandFile file1 

出力私はn=split(line, tmpLine) ... print tmpLine[j]を使用して、作られたマイナーな変更のカップルは、入力のラインを解析するための一般的な方法であった

as do foo 
cc bb aa 

それを印刷する機能。私は$ 1バールが配列(あなたのa [i]値)から渡された値からスコープを持つとは思わないので、split..tmpLine [j]に変更しました。私はまた、ENDセクションからの変数 'i'が関数reverseの範囲内に収まっていたので、状況を明確にするためにjに変更しました。


私はいくつかを理解しなければならなかったので、私が使用したデバッグバージョンを以下に示します。

gawkにアクセスする場合は、利用可能なデバッガの使い方を学ぶことができます。デバッガのないシステムでawk/gawk/nawkを使用している場合は、これがコード内で何が起こっているかを理解するための1つの方法です。あなたは、ファイルやパイプにあなたのプログラムの出力をリダイレクトしている、あなたのシステムが「は/ dev/stderrの」記法をサポートしている場合、あなたはそこにデバッグ行を印刷することができ、すなわち

#dbg print "#dbg0:line=" line > "/dev/stderr" 

一部のシステムでは、アクセスするための他の表記を使用している場合stderrだから、もしあなたがこれを多くしているなら、利用可能なものを見つけることは価値がある。

cat commandFile.debug 
function reverse(line) { 
    n=split(line, tmpLine) 
    #dbg print "#dbg0:line=" line 
    #dbg print "#dbg1:n=" n "\tj=" j "\ttmpLine[j]=" tmpLine[j] 
    for (j=n; j>0; j--) { 
    #dbg print "#dbg2:n=" n "\tj=" j "\ttempLine[j]=" tmpLine[j] 
    printf("%s ",tmpLine[j]) 
    } 

} 
# main loop 
{ a[NR]=$0 } 

# print reversed array 
#dbg END{ print "AT END"; for(i=NR; i>0; i--) printf("#dbg4:i=%d\t%s\n%s\n", i, a[i] , reverse(a[i]) 
) } 
END{ for(i=NR; i>0; i--) printf("%s\n", reverse(a[i])) } 

これが役立ちます。

2
awk ' 
{ 
    x=reverse($0) (x?"\n":"") x 
} 

END{ 
    print x 
} 

function reverse(s, p) 
{ 
    for(i=length(s);i>0;i--) 
     p=p substr(s,i,1) 
    return p 
}' File1 
2

言葉を逆にするawkは、その後、ファイルの行を逆にtacを使用しています。

tac filename | awk '{for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)}' 

また、内蔵のリスト反転機能を持っているPerlのようなものを使用することができます

tac filename | perl -lane 'print join(" ", reverse(@F))' 
関連する問題