基于两列重新排列文件内容

Ath*_*ain 6 command-line text-processing

输入:文件包含数据:

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
Run Code Online (Sandbox Code Playgroud)

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

输出如:

1      Y-X-Z
2      L-M-N
3        J
4       I-K
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 3

我将使用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))
Run Code Online (Sandbox Code Playgroud)
  • column -t infile读取文件并在此处仅打印左对齐的列。
  • sort -V按版本排序对文件进行排序V
  • 只需awk将字段读取到数组中,并使用arr键作为column#1和值作为column#3调用,然后在最后打印元素。
  • 在这里,我使用了进程替换<(sort -V <(column -t infile)),而如果您的 shell 不支持它,我们可以使用管道来代替,因为muru指出/bin/dash不支持它。

输出是:

ID      Domaind
1       Y-X-Z
2       L-M-N
3       J
4       I-k
Run Code Online (Sandbox Code Playgroud)

或者您可以按如下方式使用,而不是将整个文件保存到数组中。

ID      Domaind
1       Y-X-Z
2       L-M-N
3       J
4       I-k
Run Code Online (Sandbox Code Playgroud)