我有一个目录中的文件列表。例如,下面的文件是显示第一行的每个文件的名称(每个文件中有几个其他行并不重要)。
组别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
现在,我想根据阈值过滤文件,但不确定如何将所有标题转换为第一列,将相应的值转换为第二列。然后很容易应用阈值并过滤文件。或者有更好的方法吗?
答案 0 :(得分: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
}