2015-02-12 40 views
-1

我想对列1中的文件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

'sort'行排序。就是这样。你正在寻找一些排序文本块的东西。 'sort'不能这样做,因为它是基于行的,但'awk'可以,因为awk是基于记录而不是基于行的。 – 2015-02-12 00:52:15

回答

2

随着GNU AWK进行排序和二维数组:

$ 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] 
     } 
    } 
} 
+0

在awk 3.1上,awk-vRS ='{a [$ 0]} END {ORS =“\ n \ n”; x = asorti(a); for(i = 1; i <= x; i ++)打印[i]}'文件' – 2015-02-12 09:47:11

+1

非常感谢。 gawk和awk都很好用。我可以按seq1,seq2,seq3等数字顺序排序它们,而不是seq1,seq11,seq2,seq222 .....? – user3573959 2015-02-12 13:00:51

+0

是的,我添加了一个例子。此解决方案只适用于gawk,不适用于其他任何awk。 – 2015-02-12 13:29:07