根据两列重新排列文件内容

根据两列重新排列文件内容

输入:文件包含数据:

ID   Location  Domaind
1     20        X
1     5         y
1     25        Z
2     1         L
2     150       N
2     50        M
3     50        J
4     33        k
4      3        I

我必须根据 ID 和位置排列这些数据。意思是先按位置的升序排列 ID=1,然后从左到右打印域,顺序与位置相同。

输出如下:

1      Y-X-Z
2      L-M-N
3        J
4       I-K

答案1

我将使用awk以下命令。

awk '{arr[$1]=arr[$1]d[$1]$NF; d[$1]="-"}
    END{for (x in arr) print x"\t"arr[x]}' <(sort -V <(column -t infile))
  • column -t infile读取文件并仅打印左对齐的列。
  • sort -V按 ersion 排序对文件进行排序V
  • 并将awk字段读入arr以列#1为键、以列#3为值的数组中,然后在最后打印元素。
  • 这里我使用了进程替换,<(sort -V <(column -t infile))如果你的 shell 不支持,我们也可以使用管道。穆鲁尖锐/bin/dash却没有。

输出为:

ID      Domaind
1       Y-X-Z
2       L-M-N
3       J
4       I-k

或者您可以按照下面的方法使用,而不必将整个文件保存到数组中。

awk 'p!=$1 &&p{print l}{l=($1!=p)?$1FS$3:l"-"$3;p=$1}' <(sort -V <(column -t in))

相关内容