awk:循环过滤多个文件,如果该文件中的记录数超过某个值,则只打印该文件

awk: filtering multiple files in a loop and only print a file if the number of records in that file exceeds a certian value

我有 100-200 个文本文件,我想根据 2 列中满足的条件过滤行。除此之外,如果文件中的数据超过 20 行,我只想打印生成的文件。

我的第一部分脚本是:

    for ID in {001..178}
    do
    cat FLD0${ID}.txt | awk '{ if( == "chr15" && >9) { print; } }' > FLD0${ID}.new.txt
    done;

这很好用,但是我有一些空文件,因为这些条件都不满足,还有一些文件只有 1 或 2 行,我怀疑这些文件质量很差。现在在上面之后我只想要包含 20 行或更多数据的文件:

    for ID in {001..178}
    do
    cat FLD0${ID}.txt | awk '{ if(FNR>19 &&  == "chr15" && >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 &&  == "chr15" && >9 {  print > outfile }' FLD0${ID}.txt
done;

如果您愿意,您甚至可以 运行 awk 所有文件一次,而不是每个文件一次。

awk 'FNR>19 &&  == "chr15" && >9 {  print > (FILENAME".new") }' FLD{001..178}.txt

(那个文件的输出文件名格式略有不同,但这只是因为我懒惰。您可以使用 split()/等来修复它)