Sorting 排序命令奇怪的行为

Sorting 排序命令奇怪的行为,sorting,awk,cat,Sorting,Awk,Cat,输入文件: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 目标:查找薪资第二高的所有记录,其中4R列为薪资(以空格分隔的记录) 我运行了两个类似的命令,但输出完全不同,我缺少什么 命令1: sort

输入文件: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
目标:查找薪资第二高的所有记录,其中4R列为薪资(以空格分隔的记录)

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

命令1:

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
2 charls it 20000
命令2:

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

8 kc  it 30000
6 kl  it 30000
5 km  it 30000
4 kk  Fin 30000
2 charls it 20000

这两个命令的区别只是读取salary.txt的方式不同,但是为什么输出完全不同呢?在第二个命令中,awk不会从stdin读取。如果你把它改成

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

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

  • cat salary.txt |排序
  • echo“将被忽略的字符串”| sort salary.txt
两者都将产生完全相同的输出