将 awk 中的行拉入文件逐行

Posted

技术标签:

【中文标题】将 awk 中的行拉入文件逐行【英文标题】:Pull rows in awk to file line-by-line 【发布时间】:2022-01-19 16:38:43 【问题描述】:

我正在尝试从变量与某个标识符匹配的.csv 文件中提取行。这是一个示例数据集 (myfile.csv)

id,x,y,z
A01,1,5,7
A02,4,4,7
B01,1,6,6
A01,5,7,4
A01,4,8,4
C02,3,1,3
A01,1,2,3

我可以使用以下内容:

awk -F',' 'if($1 == "A01") print' myfile.csv > outfile.csv

awk -F',' 'if($1 == "A01") print > "outfile.csv" ' myfile.csv

这将导致outfile.csv:

A01,1,5,7
A01,5,7,4
A01,4,8,4
A01,1,2,3

但是,我正在处理一个非常大的数据集 (200Gb),并且在运行时,我必须等待 awk 完成才能输出到 outfile.csv

awk 是否有办法在文件遇到正确语句时打印到文件(即文件更新为awk 进程)

【问题讨论】:

【参考方案1】:

像大多数工具一样,awk 正在缓冲它的输出以提高效率,所以只需告诉它在每次打印后刷新它的缓冲区:

awk -F',' '$1 == "A01" print; fflush() ' myfile.csv > outfile.csv

【讨论】:

【参考方案2】:

尝试运行一次以下命令。所以我在这里做的是:尽管在每种情况下都进行了重定向,但在 awk 程序完成运行后对输出文件进行一次输出重定向。我很确定与您当前的命令相比,这应该足够快,尽管是公平的警告;没测试过。

awk -F',' 'if($1 == "A01") print' myfile.csv > "outputfile.csv"

OR 不需要明确提及 if 条件和打印,默认情况下,如果条件 if TRUE 在 awk 中,它会将该行打印为默认操作,所以上面可以简写如下:

awk -F',' '($1 == "A01")' myfile.csv > "outputfile.csv"

【讨论】:

以上是关于将 awk 中的行拉入文件逐行的主要内容,如果未能解决你的问题,请参考以下文章

AWK 学习笔记

9.6-9.7 awk工具

Linux记录-AWK语法

Zabbix自定义参数监控和awk命令

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

shell之awk