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)
但似乎什么都无法正常工作...
有任何想法吗?
您可以使用破折号(-)作为文件名,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)