我有一个包含很多这样的行的文件
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。