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)
不需要 Gawk 扩展:
awk -F '[()]' '$4 >= 60'
Run Code Online (Sandbox Code Playgroud)
这里指定的awk字段标记器-F
是一个正则表达式集[]
:字段由左括号或右括号分隔,因此您会看到第 3 列的编号是第 4 个awk字段。
您可以使用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 会更容易、更快且直观。