在表格文件中排序块

时间:2015-02-12 00:33:30

标签: linux perl awk

我想根据第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

有人能指出我在这里缺少什么吗?

非常感谢。

1 个答案:

答案 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]
        }
    }
}