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()
/等来修复它)
我有 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()
/等来修复它)