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