使用awk从stdin或文件中读取

Swa*_*ows 2 unix bash shell awk

所以这是到目前为止的代码:

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

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

所以输入:

hello
guys
hows
it
going
Run Code Online (Sandbox Code Playgroud)

将输出:

2 1
4 2
5 2
Run Code Online (Sandbox Code Playgroud)

我希望它也能够具有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}
Run Code Online (Sandbox Code Playgroud)

但似乎什么都无法正常工作...

有任何想法吗?

kon*_*iki 5

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

awk '{++a[length()]} END{for (i in a) print i, a[i]}' -
Run Code Online (Sandbox Code Playgroud)

另外,通过完全不指定文件名,awk也使用stdin

awk '{++a[length()]} END{for (i in a) print i, a[i]}'
Run Code Online (Sandbox Code Playgroud)

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

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