我想redirect一些命令的输出到awk,并在awk中使用系统调用。 但是Awk不接受带连字符的标志。 例如,让我们说我有一堆文件,我想“猫”他们。 我会使用ls -1 | awk '{ system(" cat " $1)}' ls -1 | awk '{ system(" cat " $1)}'
现在,如果我想用-n打印行号,则不能使用ls -1 | awk '{ system(" cat -n" $1)}' ls -1 | awk '{ system(" cat -n" $1)}'
您需要-n和文件名之间的空格:
ls -1 | awk '{ system(" cat -n " $1)}'
-1是不需要的。 当输出到管道时, ls隐式地每行打印1个文件。
任何带有空白的文件名都会导致此代码失败。
解析ls的输出通常是一个坏主意 。 find和shell都提供了难以处理的文件名。
John1024的有用答案解决了您的问题,并包含有用的建议,但是让我专注于语法方面:
作为命令字符串 , cat -n <file>在作为选项的n和作为操作数的 <file>之间至少需要1个空格(或制表符)。
字符串连接在awk与在shell中的功能不同:
" cat -n" $1 ,尽管在" cat -n"和$1之间存在一个空格,但不会在结果字符串中插入该空格,因为awk的字符串连接通过直接连接放置在另一个字符串之间的字符串介入空白 。
例如,下面的命令都会产生字符串字符ab ,而不管字符串连接的操作数之间是否有空格:
awk 'BEGIN { print "a""b" }' awk 'BEGIN { print "a" "b" }' awk 'BEGIN { s = "b"; print "a"s }' awk 'BEGIN { s = "b"; print "a" s }'
这不是awk的正确用例,你最好用这样的东西
find . -maxdepth 1 -type f -exec cat -n {} \;