排序命令奇怪的行为

Sort command strange behaviour

输入文件:salary.txt

1 rob   hr 10000
2 charls it 20000
4 kk  Fin 30000
5 km  it 30000
6 kl  it 30000
7 mark  hr 10000
8 kc  it 30000
9 dc  fin 40000
10 mn  hr  40000
3 abi  it 20000

objective: 查找第 4 列为薪水的所有薪水第二高的记录(space 分隔记录)

我 运行 两个相似的命令,但输出完全不同,我缺少什么?

命令 1:

sort -nr -k4,4 salary.txt | awk '!a[]{a[]=;t++}t==2'

输出:

8 kc  it 30000
6 kl  it 30000
5 km  it 30000
4 kk  Fin 30000

命令 2:

 cat salary.txt | sort -nr -k4,4 | awk '!a[]{a[]=;t++}t==2'  salary.txt

输出:

2 charls it 20000

这两个命令的区别仅在于 salary.txt 的读取方式,但为什么输出完全不同

在你的第二个命令中没有,awk 没有从标准输入读取。如果你把它改成

cat salary.txt | sort -nr -k4,4 | awk '!a[]{a[]=;t++}t==2'

你得到相同的结果

因为在第二种形式中 awk 将直接从 salary.txt 中读取 - 您将其作为输入文件的名称传递 - 忽略您传递的 sort 的输出到标准输入。在 command2 中省略最后的 salary.txt,您将看到输出与 command1 的输出相匹配。事实上,sort 的行为方式相同,形式为:

  • cat salary.txt | sort
  • echo "string that will be ignored" | sort salary.txt

两者将产生完全相同的输出。