排序命令的奇怪行为

时间:2018-08-11 15:51:56

标签: sorting awk cat

输入文件:salal.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

目标:找到薪水第二高的所有记录,其中4rthcolumn是薪水(空格记录)

我运行了两个类似的命令,但是输出却完全不同,我想念的是什么?

Command1:

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

输出:

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

command2:

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

输出:

2 charls it 20000

这两个命令的区别仅在于读取salal.txt的方式,而是输出完全不同的原因

2 个答案:

答案 0 :(得分:2)

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

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

将产生完全相同的输出。

答案 1 :(得分:1)

在第二条命令中没有,awk不会从stdin中读取。如果您将其更改为

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

您得到相同的结果