使用awk从标准输入或文件中读取数据

6

以下是我的目前的代码:

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),这样我就可以运行命令"./script filename.txt",也可以使用标准输入运行命令。

有没有办法用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}

但是似乎什么都没有正常工作... 你有什么想法吗?

如果您告诉我们做什么而不是如何做,并附带示例数据和预期输出,我们可能能够帮助您。如果您想自己解决问题并且想要同时从stdin和awk文件中读取,请使用getline读取文件。祝好运。 - James Brown
你在说什么?你已经在从标准输入读取了! - Michael Vehrs
2个回答

15
你可以使用破折号 (-) 作为文件名,awk将其理解为使用标准输入作为要解析的文件。例如:
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

awk默认可以通过stdin读取管道中的数据。

您可以像这样从文件和stdin中读取数据:

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

结尾处的破折号代表标准输入(stdin)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接