Kev 的解决方案旨在反转每个单词中的文本。您的示例输出没有显示这一点,但他的关键点是使用函数。
你有你需要的代码,你只需要重新排列一下。
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]。我还发现 END 部分中的 'i' 变量保留在函数 reverse 的范围内,所以我将其更改为 j 以消除歧义。
我必须弄清楚一些事情,所以下面是我使用的调试版本。
如果您要访问 gawk,那么您最好学习如何使用可用的调试器。如果您在没有调试器的系统上使用 awk/gawk/nawk,那么这是了解代码中发生的情况的一种方法。如果您将程序输出重定向到文件或管道,并且如果您的系统支持“/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]) ) }
我希望这会有所帮助。