![如何对不同文件中的行集合进行排序?](https://linux22.com/image/40468/%E5%A6%82%E4%BD%95%E5%AF%B9%E4%B8%8D%E5%90%8C%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E8%A1%8C%E9%9B%86%E5%90%88%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F%EF%BC%9F.png)
我想按第二列对每个文件中的第二行进行排序,并打印相应文件的名称。我正在这样做-
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 脚本完成了工作。