如何删除第 3 列中数字小于 60 的行?

Man*_*mar 6 command-line text-processing

我有一个大文件。我需要删除文件中第 3 列中数字小于 60 的所有行。

示例文件:

35110   Bacteria(100)   Proteobacteria(59)  Alphaproteobacteria(59)
12713   Bacteria(100)   Bacteroidetes(100)  Bacteroidia(100)
Run Code Online (Sandbox Code Playgroud)

期望的输出:

12713   Bacteria(100)   Bacteroidetes(100)  Bacteroidia(100)
Run Code Online (Sandbox Code Playgroud)

Ste*_*nny 8

不需要 Gawk 扩展:

awk -F '[()]' '$4 >= 60'
Run Code Online (Sandbox Code Playgroud)

这里指定的awk字段标记器-F是一个正则表达式集[]:字段由左括号或右括号分隔,因此您会看到第 3 列的编号是第 4 个awk字段。


Byt*_*der 4

您可以使用awk(实际上它必须是 GNU AWK 实现gawk,而不是mawk包含较少功能 - 您可能必须安装它sudo apt install gawk)来完成此工作:

gawk '{match($3,/\((.+)\)/,m);if(m[1]>=60){print $0}}' MY_FILE
Run Code Online (Sandbox Code Playgroud)

尽管不可否认,对于未经训练的人来说,这看起来像是黑魔法,但逻辑很简单:

  • 对于每一行,运行最外面的大括号内的内容:
  • 首先,match($3, /\((.+)\)/, m)将正则表达式\((.+)\)(与左圆括号和右圆括号匹配,将括号之间的内容存储为第一个捕获组)与$3已处理输入行的第三列进行匹配,并将生成的匹配数组存储在变量 中m
  • 然后,检查条件if (m[1] >= 60),即匹配的第一个捕获组的值(无论输入中括号之间的值)是否大于或等于 60。如果为真,则执行 do {print $0},它会简单地打印当前处理的整个行。


小智 0

如果您不想学习/使用命令行工具,您不妨在 LibreOffice Calc 中打开文件并仅过滤数据(Calc 支持制表符分隔的文件)。

如果您了解任何编程语言,那么编写一个小程序来过滤数据就很简单了。

但如果您有大量数据集需要处理,那么使用 MySQL 等 DBMS 会更容易、更快且直观。