我想根据第1列对文件A进行排序,保留空行并从上到下出现值。
我有一个表格文件A:
seq1 5 15
seq1 20 34
seq1 50 48
seq1 45 36
seq2 17 20
seq1 55 75
seq1 80 84
seq2 30 48
seq2 55 66
seq3 27 40
我想获得如下输出:
seq1 5 15
seq1 20 34
seq1 50 48
seq1 45 36
seq1 55 75
seq1 80 84
seq2 17 20
seq2 30 48
seq2 55 66
seq3 27 40
应保留空行。
我尝试过使用sort
,但它会删除空白行,并且不会从上到下维护订单。
sort -k1,1 fileA.txt
有人能指出我在这里缺少什么吗?
非常感谢。
答案 0 :(得分:2)
使用GNU awk进行排序和2D数组:
$ cat tst.awk
BEGIN { RS=""; ORS="\n\n" }
{ rec[$1][++cnt[$1]] = $0 }
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (key in rec) {
for (nr=1; nr <= cnt[key]; nr++) {
print rec[key][nr]
}
}
}
$
$ gawk -f tst.awk file
seq1 5 15
seq1 20 34
seq1 50 48
seq1 45 36
seq1 55 75
seq1 80 84
seq2 17 20
seq2 30 48
seq2 55 66
seq3 27 40
至少你需要gawk 4.0版。
对于数字排序:
BEGIN { RS=""; ORS="\n\n" }
{ key=gensub(/^[^[:digit:]]+/,"","",$1); rec[key][++cnt[key]] = $0 }
END {
PROCINFO["sorted_in"] = "@ind_num_asc"
for (key in rec) {
for (nr=1; nr <= cnt[key]; nr++) {
print rec[key][nr]
}
}
}