【问题标题】:awk in while loop not workingawk 在 while 循环中不起作用
【发布时间】:2016-07-28 00:49:40
【问题描述】:

我正在尝试以下命令:

while read file
do
awk -v ID="$file" '$1==ID{print $0}' input2 > output
done < input1

input1 如下所示:

1
2
3
4

input2 看起来像这样:

2 a b c
3 a b c
5 a b c
6 a b c

输出应如下所示:

3 a b c

因此,换句话说,如果文件 input2 的第一列与文件 input1 中的一个值匹配,我希望将 input2 的整行打印到输出。我上面的while循环只产生空文件但是......可能是什么问题?非常感谢!

【问题讨论】:

    标签: bash awk while-loop


    【解决方案1】:

    不要这样做,它非常低效且脆弱(请参阅https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。改为这样做:

    awk 'NR==FNR{ids[$0];next} $1 in ids' input1 input2 > output
    

    【讨论】:

    • +1!直到最近我还在想 awk 只能处理一个输入文件。我认为大多数人也忽略了这一点,因此while read 构造。
    • 是的,不幸的是,很多人认为 awk 只是一个花哨的 grep 或 sed。然而,它远不止这些——它是 标准的 UNIX 通用文本处理工具。我总是建议任何可能不得不在 UNIX 中操作文本的人首先阅读 Arnold Robbins 的 Effective Awk Programming, 4th Edition。它可能会改变游戏规则。
    • 当然,尽管现在我们有了 python,它变得有点过时了。顺便说一句,你能解释一下你的oneliner吗?如果人们了解它的工作原理,他们会更多地使用多个输入流。
    • 现在我们有了 python”? Python 已经存在了四分之一个世纪,它没有也不会让 awk 在任何方面看起来都过时。此外,它不再是 awk 的对等点,而 awk 是 sed 的对等点 - awk 用于处理文本、句号。我发布的内容绝对是基本的 awk,在 Arnold Robbins 的《Effective Awk programming, 4th Edition》一书中得到了很好的解释(以及许多其他同样有用的特性)。
    • 你说得对,它是基于我最近使用(10 年)的 python,这让我完全停止在 awk 中编码。至少可以说主要是基于意见。当行的大小太大时,awk 有其限制和崩溃(40000+ 字符,我最近通过提出 python 替代解决了这样一个 awk 问题)但在这种情况下,我们可以将文件视为文本文件还是伪装的二进制文件?
    【解决方案2】:

    每次迭代都会销毁输出 使用 >> 而不是 > 或仅显示最后一次迭代

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2015-08-02
      • 2017-11-13
      • 1970-01-01
      • 2018-06-12
      • 1970-01-01
      • 2017-08-01
      相关资源
      最近更新 更多