ケヴのソリューションは、各単語のテキストを逆に見えます。あなたの出力例はそれを示していませんが、彼の重要なポイントは関数を使うことです。
必要なコードがありますが、少し並べ替えるだけです。
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])) }
これが役立ちます。
+1もよく表示されます。良い書式設定、サンプル入力、サンプル出力、および動作していないコード!良いショーと投稿を続ける! – shellter