如何从多个文件中按字母顺序提取名字

如何从多个文件中按字母顺序提取名字

说我有

文件1:

Aaron
Vernon
Troy
Roy

文件2:

Jason
Derek
Mariano
Alex

我想显示:

File1: Aaron
File2: Alex

可以执行这两项操作的单行 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

如果您愿意,可以将其写在一行中

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

对于最初的问题(每个文件一行,并非所有行都按照您现在所说的“需要”排序),如果文件很大(特别是大于内存),并且如果您有非古老的 ​​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 ...

相关内容