使用awk从stdin OR文件读取

时间:2017-04-13 04:47:44

标签: bash shell unix awk

所以我的代码到目前为止:

awk '{++a[length()]} END{for (i in a) print i, a[i]}' <$1 | sort -n

从文本文件中读取行的长度,并输出行的长度,然后输出多少行具有相同的长度。

所以输入:

hello
guys
hows
it
going

将输出:

2 1
4 2
5 2

我希望它能够拥有stdin,所以我将能够运行命令&#34; ./ script filename.txt&#34;并且还能够使用标准输入运行命令。

有没有办法可以用while循环完成?我试图做类似的事情:

while read line
do
    awk '{++a[length()]} END{for (i in a) print i, a[i]}' <${1:-/dev/stdin} | sort -n
done <${1:-/dev/stdin}

但似乎没有任何工作正常......

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用短划线(-)作为文件名,awk将其理解为使用stdin作为要解析的文件。例如:

awk '{++a[length()]} END{for (i in a) print i, a[i]}' -

此外,通过根本不指定文件名,awk也使用stdin

awk '{++a[length()]} END{for (i in a) print i, a[i]}'

请注意,您可以将它们混合使用。以下将按顺序处理file1.txt,stdin和file2.txt:

awk '{++a[length()]} END{for (i in a) print i, a[i]}' file1.txt - file2.txt

答案 1 :(得分:0)

将数据传输到awk时,

awk默认可以读取stdin。

您可以像这样读取文件和标准输入数据:

echo $'pipe1\npipe2\npipe3' | awk '{print NR, $0}' file -

最后的破折号代表stdin。