2017-02-28 55 views
2

我有一个目录中的文件列表。例如,下面的文件是显示第一行的每个文件的名称(它在每个文件中都有其他几行并不重要)。为目录中的多个文件设置阈值

组别1

8 325 
quick brown fox jumped 
Over the lazy dog 

组2

8 560 
There is more content here 

组3

7 650 

我想读的第一并检查第一个值是否等于8,第二个值是否大于500.如果满足此条件,则将文件的名称打印到新的文本文件中。

结果

Group2 

我尝试使用

for f in *.Group; 
do head -n1 *.Group > new-file; 
done 

这给了我与头名的文件和每个文件的目录中的第一行

=> Group1 <= 
8 325 

=> Group2 <= 
8 560 

=> Group3 <= 
7 650 

现在,我想根据阈值过滤文件,但不是su重新如何将所有标题转换为第一列并将相应的值转换为第二列。然后很容易应用阈值并过滤文件。还是有更好的方法来做到这一点?

+0

因此,您的文件被称为'Group1'或'Group1.Group'? – FloHe

+0

Group1,group2,..等 – Paul

回答

4

您可以使用awk

awk 'FNR==1 && $1==8 && $2>500{print FILENAME}' *.Group > Result 

说明:

# FNR contains the number of line of the current(!) input 
# file. Check if the conditions are met and print the filename 
FNR==1 && $1==8 && $2>500 { 
    print FILENAME 
} 

上述解决方案应与awk任何版本。如果您有GNU awk,则可以利用nextfile表达式。使用它,您可以在处理完第一行后跳过输入文件的其余行:

# Check if the conditions are met and print the filename in that case 
$1==8 && $2>500 { 
    print FILENAME 
} 

# Skip the remaining lines in the current file and continue 
# with the next file 
{ 
    nextfile 
} 
+0

因此我检查了文件awk -F'''{print NF}'Group1第一行中的字段数,它显示为6,因此在这种情况下解决方案可能会有点不同,因为它们不只是两个独立的领域。 – Paul

+0

'-F'''将行分割成单独的字符。 'Group1'有6个字符,这是正确的。所以你是什么意思? – hek2mgl

+0

对不起,只是困惑。作品完美无瑕! – Paul

相关问题