【问题标题】:Sort command strange behaviour排序命令奇怪的行为
【发布时间】:2019-01-18 22:42:34
【问题描述】:

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

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

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

命令 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:

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

输出:

2 charls it 20000

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

【问题讨论】:

    标签: sorting awk cat


    【解决方案1】:

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

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

    你得到相同的结果

    【讨论】:

      【解决方案2】:

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

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

      都会产生完全相同的输出。

      【讨论】:

        猜你喜欢
        • 2015-03-28
        • 1970-01-01
        • 2012-04-05
        • 2011-03-13
        • 2012-06-21
        • 2022-01-05
        • 2015-12-07
        • 2015-01-11
        • 2012-10-22
        相关资源
        最近更新 更多