私が持っていると言う
ファイル1:
Aaron
Vernon
Troy
Roy
ファイル2:
Jason
Derek
Mariano
Alex
表示したい内容:
File1: Aaron
File2: Alex
これらの両方を実行できる1行のbashコマンドは何ですか?
sortを使用してからtail -1を使用するつもりですが、今回は1つのファイルからのみ抽出できます。
答え1
配列ソート機能を内蔵したGNU awkを使用すると、次のことがasort
できます。
gawk '
BEGINFILE{delete a};
{a[FNR]=$0};
ENDFILE{asort(a); print FILENAME": "a[1];}
' File1 File2
File1: Aaron
File2: Alex
必要に応じて1行で書くことができます
gawk 'BEGINFILE{delete a}; {a[FNR]=$0}; ENDFILE{asort(a); print FILENAME": "a[1];}' File1 File2
答え2
for f in File* ; do
printf "%s: %s\n" "$f" $(sort "$f" | head -n 1)
done
出力:
File1: Aaron
File2: Alex
答え3
これはあなたの目標を達成するようです。
grep . File1 File2|sort -k 2,2 -t:|sed 's/:/: /g'
File1: Aaron
File2: Alex
File2: Derek
File2: Jason
File2: Mariano
File1: Roy
File1: Troy
File1: Vernon
答え4
元の質問(ファイルごとに1行、現在「必要」と言うようにすべての行がソートされていない)、ファイルが大きい場合(特にメモリより大きい場合)、古代のGNU awkではない場合(大部分のLinuxと一部)がある他のbash
システム:
[g]awk -vx= 'FNR==1||$0<x {x=$0""} ENDFILE {print FILENAME": "x}' file1 file2 ...
GNUではなくawk(または古代のgawk)を使用してこれを行うことはできますが、少し不気味です。
[*]awk -vx= 'FNR==1&&NR!=1 {print f": "x} FNR==1||$0<x {f=FILENAME;x=$0""} END {if(NR) print f": "x}' file1 file2 ...