输入:文件包含数据:
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))