如何在bash(linux)中排序特定列而不修改其他列而不创建临时文件?

时间:2015-08-19 20:18:24

标签: linux bash

输入文件

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)中对特定列进行排序而不修改其他列而不创建临时文件?

2 个答案:

答案 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]}'