计算文本文件中的重复项

时间:2015-12-03 16:29:53

标签: awk sed

我有一个以下类型的文本文件:

XLOC_000001 - - TCONS_00000001 - TSS1 
XLOC_000002 - - TCONS_00000002 - TSS2 
XLOC_000003 - - TCONS_00000003 - TSS3 
XLOC_000003 - - TCONS_00000004 - TSS3 
XLOC_000004 - - TCONS_00000007 - TSS4 
XLOC_000004 - - TCONS_00000008 - TSS4 
XLOC_000004 - - TCONS_00000009 - TSS4 
XLOC_000004 - - TCONS_00000010 - TSS4 
XLOC_000004 - - TCONS_00000011 - TSS4 

我想计算第一列中重复ID的数量,并按以下方式打印其他列:

1 XLOC_000001 - - TCONS_00000001 - TSS1 
1 XLOC_000002 - - TCONS_00000002 - TSS2 
2 XLOC_000003 - - TCONS_00000003 - TSS3 
              - - TCONS_00000004 - TSS3 
5 XLOC_000004 - - TCONS_00000007 - TSS4 
              - - TCONS_00000008 - TSS4 
              - - TCONS_00000009 - TSS4 
              - - TCONS_00000010 - TSS4 
              - - TCONS_00000011 - TSS4

我用过awk并试过这个

 awk '{h[$1]++}; END { for(k in h) print k, h[k] }' newtrails.txt

这只提供了第一列的计数,但是有人可以编辑代码来打印其他列,如上所示吗?

1 个答案:

答案 0 :(得分:2)

为此,gsub()可以成为您最好的朋友:

$ awk 'FNR==NR {a[$1]++; next} seen[$1]++{gsub(/./," ",$1)} {print ($1 in a) ? a[$1] : FS,$0}' file file
1 XLOC_000001 - - TCONS_00000001 - TSS1 
1 XLOC_000002 - - TCONS_00000002 - TSS2 
2 XLOC_000003 - - TCONS_00000003 - TSS3 
              - - TCONS_00000004 - TSS3
5 XLOC_000004 - - TCONS_00000007 - TSS4 
              - - TCONS_00000008 - TSS4
              - - TCONS_00000009 - TSS4
              - - TCONS_00000010 - TSS4
              - - TCONS_00000011 - TSS4

这两次读取文件:

  • 首先计算第一列出现的次数。
  • 然后,打印值。它第一次打印第一列;否则,它用空格替换所有字符。然后,打印该行。