awk:在循环中过滤多个文件,只有在该文件中的记录数超过certian值时才打印文件

时间:2015-04-21 13:54:26

标签: 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;

这个工作正常,但后来我有一些空文件,因为这些条件都没有满足,而且我怀疑只有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行数据的额外条件。

谢谢,

1 个答案:

答案 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() /等修复它。)