这是一种在文件中选择给定列具有给定值的行的优雅方法吗?

这是一种在文件中选择给定列具有给定值的行的优雅方法吗?

我有一个包含很多这样的行的文件

0       file:/home/knappen/somefilename.txt  7       0.2838356973995272      19      0.21823286052009455     18      0.10121158392434988     15      0.07816193853427897     11
  0.07284278959810875     6       0.056885342789598115    8       0.03738179669030733     22      0.032062647754137114    23      0.01610520094562648     12      0.01610520094562648     16      0.010786052009456266    0       0.010786052009456266    13      0.009013002364066195    5       0.009013002364066195    10      0.007239952718676124    9       0.007239952718676124    14      0.005466903073286052    4       0.005466903073286052    21      0.003693853427895981    20      0.003693853427895981    17      0.003693853427895981    3       0.003693853427895981    2       0.003693853427895981    1
   0.003693853427895981

我想选择第三列中的条目等于某个给定数字的所有行。

我知道如何grep -E为此目的编写一个模式,或者编写一个具有此效果的小型 python 或 perl 脚本,但我想知道是否有一个使用 GNU coreutils 的优雅解决方案。

PS我在这个问题中找到了一些有好的建议的答案根据列值选择 CSV 文件中的行,但这些工具超出了 GNU coreutils 的范围。那里的答案足以为我工作,但为了更多地了解 shell 实用程序的强大功能,我无论如何都会问这个问题。

答案1

Awk是一个非常强大的文本格式化/操作和模式匹配工具。它使用自定义分隔符对文件的每一行进行分隔,默认为单个空格。拆分后,可以从 访问各个字段$1,$2..$N,其中N是该行中的最后一个列号。

因此,根据您的要求,只需将第三列与您需要的值相匹配

awk '$3 == "string"' file 

如果文件是具有不同分隔符的 CSV,例如,只需将其定义为

awk -v FS="," '$3 == "string"' file

也不awk是 GNU 特定的,它的变体应该可以在 *nix 机器上使用并且也兼容 POSIX。

相关内容