【问题标题】:Reading from stdin OR file using awk使用 awk 从标准输入或文件读取
【发布时间】:2017-04-13 04:47:44
【问题描述】:

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

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

我希望它也可以有标准输入,这样我就可以运行命令“./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的文件中读取,请使用getline作为文件。祝你好运。
  • 你在说什么?你已经在从标准输入读取了!

标签: bash shell unix awk


【解决方案1】:

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

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

另外,通过完全不指定文件名,awk 也使用标准输入

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

【讨论】:

    【解决方案2】:

    当您将数据通过管道传输到 awk 时,默认情况下 awk 可以通过标准输入读取。

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

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

    最后的破折号代表标准输入。

    【讨论】:

      猜你喜欢
      • 2011-03-30
      • 2014-05-27
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多