如何对不同文件中的行集合进行排序?

如何对不同文件中的行集合进行排序?

我想按第二列对每个文件中的第二行进行排序,并打印相应文件的名称。我正在这样做-

rm tmp;
for filename in file*; do
  num=`head -2 $filename | tail -1 | awk '{print $2}'`;
  echo "$filename $num" >> tmp;
done;
sort -n -k2,2 tmp      

是否可以以不包含文件的更好方式完成tmp

答案1

尝试:

$ awk 'FNR == 2' file1 file2 filen | sort -n -k2,2

通过gawk,您可以使用nextfile来提高效率:

$ gawk 'FNR == 2 {print FILENAME,$2; nextfile}' file1 file2 filen | sort -n -k2,2

nextfile或者您可以在其他实现中编写自己的函数awk,请参阅

如果你没有gawk,你可以使用perl更便携:

$ perl -anle 'print "$ARGV $F[1]" and close ARGV if $. == 2' file1 file2 filen |
  sort -n -k2,2

答案2

for f in file* ; do { 
    read line
    read na num na
} <"$f"
    printf '%s\t%s\n' "$f" "$num"
done | sort -t\<tab> -n -k2,2

虽然很难确定,因为您没有注意到字段分隔符,但awk我认为上面假设了默认值,但使用本机 shell 脚本完成了工作。

相关内容