我有一个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 ...
谢谢
答案 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)
您可以使用awk
和column
:
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