Loops awk:在一个循环中过滤多个文件,并且仅当文件中的记录数超过某个认证值时才打印该文件
我有100-200个文本文件,我想根据2列中满足的条件筛选行。除此之外,如果文件中的数据超过20行,我只想打印结果文件 我第一部分的脚本是:Loops awk:在一个循环中过滤多个文件,并且仅当文件中的记录数超过某个认证值时才打印该文件,loops,awk,rows,Loops,Awk,Rows,我有100-200个文本文件,我想根据2列中满足的条件筛选行。除此之外,如果文件中的数据超过20行,我只想打印结果文件 我第一部分的脚本是: for ID in {001..178} do cat FLD0${ID}.txt | awk '{ if($2 == "chr15" && $5>9) { print; } }' > FLD0${ID}.new.txt done; 这很好,但是我有一些空文件,因为这两个条件都不满足,而且有些文
for ID in {001..178}
do
cat FLD0${ID}.txt | awk '{ if($2 == "chr15" && $5>9) { print; } }' > FLD0${ID}.new.txt
done;
这很好,但是我有一些空文件,因为这两个条件都不满足,而且有些文件只有1或2行,我怀疑这些文件的数据质量很低。现在,在完成上述操作之后,我只需要包含20行或更多数据的文件:
for ID in {001..178}
do
cat FLD0${ID}.txt | awk '{ if(FNR>19 && $2 == "chr15" && $5>9) { print; } }' > FLD0${ID}.new.txt
done;
上面的第二个脚本(带有FNR)似乎无效,我仍然得到空文件
我怎样才能让这个循环像上面的原始循环一样工作,并且在每个文件中有20行或更多的数据
谢谢,shell在运行命令后立即创建输出文件(重定向立即创建文件)。您将始终以这种方式获得空文件。如果您不想这样做,那么让
awk
直接写入该文件,以便仅在必要时创建该文件
for ID in {001..178}
do
awk -v outfile=FLD0${ID}.new.txt 'FNR>19 && $2 == "chr15" && $5>9 { print > outfile }' FLD0${ID}.txt
done;
您甚至可以对所有文件运行一次awk
,而不是根据需要对每个文件运行一次
awk 'FNR>19 && $2 == "chr15" && $5>9 { print > (FILENAME".new") }' FLD{001..178}.txt
(这个输出文件名格式略有不同,但这只是因为我很懒。你可以用
split()
/等)来解决这个问题。最好使用FLD{001..178}.txt
,因为你目前在第二部分100后缺少所有内容,但这是最好的方法。@JID确实如此。我只是想在那里使用FLD*.txt
,但没有删除足够的内容,但你是正确的,使用原始的大括号扩展更好。谢谢大家,我非常偏离了Etan的第一个解决方案,它按照我的意愿工作。我得查一下“UOOC”是什么意思。直到现在,我还不知道没有“猫”这个循环会工作。很抱歉我的回复太晚了。任何时候你在shell中写一个循环只是为了操纵文本,你的方法都是错误的。有关正确的方法,请参阅@EtanReisner答案中的第二个awk脚本。在你的问题中也失去了UOOC。