我有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;
这个工作正常,但后来我有一些空文件,因为这些条件都没有满足,而且我怀疑只有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行数据的额外条件。
谢谢,
答案 0 :(得分:3)
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()
/等修复它。)