使用bash / awk / perl / sed重新排列来自不同列的值

时间:2017-11-02 16:43:16

标签: bash perl awk sed

我有一个文件:

54      56        A
66      66        B
23       4        C
23      37        D
100     55        E

我想重新排列它,以便第1列始终小于或等于第2列:

54      56        A
66      66        B
4       23        C
23      37        D
55     100        E

我对使用bash / perl / sed / awk的任何简短解决方案感兴趣。

我在python中使用for循环创建了一些内容,如果col1>检查每一行。 col2,然后写一个新文件,但我不知道如何更简单地做到这一点。

3 个答案:

答案 0 :(得分:4)

您可以像这样使用awk

awk -v OFS='\t' '$2 < $1{n=$2; $2=$1; $1=n} 1' file

54      56        A
66      66        B
4       23        C
23      37        D
55      100       E

答案 1 :(得分:3)

作为Perl命令行程序:

perl -a -n -E'say join "\t", sort({ $a <=> $b } @F[0, 1]), $F[2]' file

答案 2 :(得分:1)

关注awk可能对您有帮助。

awk '{printf("%s\t%s\n",$1>$2?$2 "\t" $1:$1 "\t" $2,$3)}'   Input_file

说明: 只需使用printf打印awk的内置命令即可。然后在其中使用%s 2次,其中包含TAB,然后\n新行,最后在新行上打印下一行。现在,在打印各自的值时,我使用条件运算符?:所以如果第一个字段大于第二个字段则检查条件然后打印第二个字段TAB和第一个字段,如果不是则打印副反之亦然。

输出如下。

54      56      A
66      66      B
4       23      C
23      37      D
55      100     E