Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk从stdin或文件读取_Bash_Shell_Unix_Awk - Fatal编程技术网

Bash 使用awk从stdin或文件读取

Bash 使用awk从stdin或文件读取,bash,shell,unix,awk,Bash,Shell,Unix,Awk,这是我到目前为止的代码: awk '{++a[length()]} END{for (i in a) print i, a[i]}' <$1 | sort -n 将输出: 2 1 4 2 5 2 我希望它也能有stdin,这样我就可以运行命令“/script filename.txt”,也可以使用标准输入运行命令 有没有什么方法可以通过while循环来实现?我尝试过做类似的事情: while read line do awk '{++a[length()]} END{for (

这是我到目前为止的代码:

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

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}
读取行时
做

awk'{++a[length()]}END{for(i in a)print i,a[i]}'awk在将数据传输到awk时,默认情况下可以通过stdin读取

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

echo $'pipe1\npipe2\npipe3' | awk '{print NR, $0}' file -
末尾的破折号表示stdin。

您可以使用破折号(
-
)作为文件名,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

如果您告诉我们什么而不是如何,并将样本数据与预期输出一起发布,我们可能会帮助您。如果您想自己解决这个问题,并且想同时从stdin和带有awk的文件中读取数据,请对该文件使用
getline
。祝你好运,你在说什么?你已经在读stdin了!
awk '{++a[length()]} END{for (i in a) print i, a[i]}' file1.txt - file2.txt