排序命令奇怪的行为
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
两者将产生完全相同的输出。
输入文件: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
两者将产生完全相同的输出。