千電子伏的解決方案看起來扭轉每個字的文本。你的示例輸出沒有顯示,但他的關鍵是使用一個函數。
你有你需要的代碼,你只需要重新安排它一點。
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
輸出
as do foo
cc bb aa
有幾個予製成,使用n=split(line, tmpLine) ... print tmpLine[j]
小的變化,是解析線路輸入的在一個的常用方法功能將其打印出來。我不認爲$ 1變量的範圍是從數組中傳入的值(您的a [i]值),所以我將其更改爲split..tmpLine [j]。我還發現,從頂端部分的「我」變量保持在範圍上的功能reverse
,所以我改變了到j來消除歧義的情況。
我不得不弄清幾件事情,所以下面是我使用的調試版本。
如果您打算使用gawk,那麼您將學習如何使用可用的調試器。如果你在沒有調試器的系統上使用awk/gawk/nawk,那麼這是理解你的代碼中發生了什麼的一種方法。如果您要重定向您的節目輸出到文件或管道,如果你的系統支持「的/ dev /標準錯誤」的符號,你可以打印調試行出現,即
#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 2012-03-27 14:43:49