将 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 中的行拉入文件逐行的主要内容,如果未能解决你的问题,请参考以下文章