複数のファイルから名前をアルファベット順に抽出する方法

複数のファイルから名前をアルファベット順に抽出する方法

私が持っていると言う

ファイル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 ...

関連情報