Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops awk:在一个循环中过滤多个文件,并且仅当文件中的记录数超过某个认证值时才打印该文件_Loops_Awk_Rows - Fatal编程技术网

Loops awk:在一个循环中过滤多个文件,并且仅当文件中的记录数超过某个认证值时才打印该文件

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; 这很好,但是我有一些空文件,因为这两个条件都不满足,而且有些文

我有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行或更多的数据


谢谢,

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。