输入文件
0 1.0069770730517629 A 1 1.0068122761874614 A 2 1.0004297763706849 B 3 1.0069220626905635 C 4 1.0079998216945956 C 5 1.0006092898635817 D 6 1.0071274842017928 A 7 1.0083750686808803 A 8 1.0006868227863552 B 9 1.0073693844413083 C 10 1.0086546525825624 C 11 1.0007234442925264 D
预期输出:
0 1.0086546525825624 A 1 1.0083750686808803 A 2 1.0079998216945956 B 3 1.0073693844413083 C 4 1.0071274842017928 C 5 1.0069770730517629 D 6 1.0069220626905635 A 7 1.0068122761874614 A 8 1.0007234442925264 B 9 1.0006868227863552 C 10 1.0006092898635817 C 11 1.0004297763706849 D
我使用临时文件的解决方案
awk '{print $2}' input.txt | sort -gr > temp.txt
paste input.txt temp.txt | awk '{print $1,$4,$3}'
rm temp.txt
问题
是否可以在bash(linux)中对特定列进行排序而不修改其他列而不创建临时文件?
答案 0 :(得分:2)
您可以使用-
作为paste
的文件名参数,告诉它使用标准输入。
cut -d' ' -f2 input.txt | sort -gr | paste input.txt - | cut -d' ' -f1,4,3
如果它不支持此功能,您可以使用流程替换。
paste input.txt <(cut -d' ' -f2 input.txt | sort -gr) | cut -d' ' -f1,4,3
答案 1 :(得分:1)
要求救援
awk '{c1[NR]=$1; c2[NR]=$2; c3[NR]=$3} END {asort(c2); for(i=1;i<=NR;i++) print c1[i],c2[NR+1-i],c3[i]}'