他のファイルの行のコレクションをソートする方法は?

他のファイルの行のコレクションをソートする方法は?

各ファイルの2番目の行を2番目の列に並べ替え、そのファイルの名前を印刷したいと思います。私はこれをしています -

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デフォルト値を想定していますが、デフォルトのシェルスクリプトを使用すると作業が行われると思います。

関連情報