我是编程语言和东西的新手,所以我必须用awk反转所有的行以及那些行中的所有单词,从文件中打印出来.
"File1"反转:
aa bb cc
foo做的
而"File1"的输出打印应该是这样的:
和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]}
Run Code Online (Sandbox Code Playgroud)
我需要在终端中使用此命令处理两个文件:
awk -f commandFile FileToBePrinted
Run Code Online (Sandbox Code Playgroud)
问题是我在这一切都是开始的,我不知道如何将这两者结合起来.谢谢!
凯夫的解决方案是颠倒每个单词中的文本。您的示例输出并未显示这一点,但他的关键点是使用函数。
您已经有了所需的代码,只需稍微重新排列一下即可。
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]) ) }
Run Code Online (Sandbox Code Playgroud)
跑步
awk -f commandFile file1
Run Code Online (Sandbox Code Playgroud)
输出
as do foo
cc bb aa
Run Code Online (Sandbox Code Playgroud)
我做了一些小的更改,使用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"
Run Code Online (Sandbox Code Playgroud)
有些系统有其他用于访问 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]) ) }
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助。
| 归档时间: |
|
| 查看次数: |
5192 次 |
| 最近记录: |