保留第一个重复项,并使用Awk用空白单元格替换其余部分

时间:2018-10-10 11:07:45

标签: linux bash csv awk

我有一个tsv文件,其中有2列,第二列中有重复项。我想做的是保留第一个重复值,并将其余值替换为空白。例如

原始电视:

ahah.asd   aha
ahsjd.asd  aha
asdd.asda  aha
ajd.asd    aha
asdfk.lo   abb
hasd.pou   abb
hasd.asd   jjj
asidh.09   kkk
asdhs.97   kkk

预期输出:

ahah.asd   aha
ahsjd.asd  
asdd.asda  
ajd.asd    
asdfk.lo   abb
hasd.pou   
hasd.asd   jjj
asidh.09   kkk
asdhs.97   

除此之外,我想添加一列,直到在第2列中看到重复项为止,该列将递增。例如:

ahah.asd   aha   1
ahsjd.asd        2
asdd.asda        3
ajd.asd          4
asdfk.lo   abb   1
hasd.pou         2
hasd.asd   jjj   1
asidh.09   kkk   1 
asdhs.97         2

这可能吗?我想使用awk ...

谢谢

4 个答案:

答案 0 :(得分:1)

$ awk 'BEGIN{FS=OFS="\t"} {print $1, (cnt[$2]++ ? "" : $2), cnt[$2]}' file
ahah.asd        aha     1
ahsjd.asd               2
asdd.asda               3
ajd.asd         4
asdfk.lo        abb     1
hasd.pou                2
hasd.asd        jjj     1
asidh.09        kkk     1
asdhs.97                2

答案 1 :(得分:0)

尝试一下:

$ awk -v OFS='\t' 's!=$2{c=0;s=$2}{print $1,(c++?"":s),c}' file
ahah.asd    aha 1
ahsjd.asd       2
asdd.asda       3
ajd.asd     4
asdfk.lo    abb 1
hasd.pou        2
hasd.asd    jjj 1
asidh.09    kkk 1
asdhs.97        2

每个字段之间都有一个标签。

答案 2 :(得分:0)

您可以使用awkcolumn

awk '{print $1,(($2 in a)?"":$2),++a[$2]}' OFS=, file | column -t -s,

答案 3 :(得分:0)

便携式Perl解决方案

$ perl -F'\s+' -lane ' { $p=$x{$F[1]}++;$k=$p==0?$F[1]:""; print "$F[0]\t$k\t",$p+1 } ' tsv_file
ahah.asd        aha     1
ahsjd.asd               2
asdd.asda               3
ajd.asd         4
asdfk.lo        abb     1
hasd.pou                2
hasd.asd        jjj     1
asidh.09        kkk     1
asdhs.97                2

更紧凑:

$ perl -F'\s+' -lane ' { $p=$x{$F[1]}++==0?$F[1]:""; print "$F[0]\t$p\t",$x{$F[1]} } ' tsv_file