说我有
文件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 ...