Uniq in awk; 使用awk删除列中的重复值

D W*_*D W 4 bash awk unique

我有一个大型数据文件,格式如下:

ENST00000371026 WDR78,WDR78,WDR78,  WD repeat domain 78 isoform 1,WD repeat domain 78 isoform 1,WD repeat domain 78 isoform 2,
ENST00000371023 WDR32   WD repeat domain 32 isoform 2
ENST00000400908 RERE,KIAA0458,  atrophin-1 like protein isoform a,Homo sapiens mRNA for KIAA0458 protein, partial cds.,
Run Code Online (Sandbox Code Playgroud)

列是制表符分隔的.列中的多个值以逗号分隔.我想删除第二列中的重复值,结果如下所示:

ENST00000371026 WDR78   WD repeat domain 78 isoform 1,WD repeat domain 78 isoform 1,WD repeat domain 78 isoform 2,
ENST00000371023 WDR32   WD repeat domain 32 isoform 2
ENST00000400908 RERE,KIAA0458   atrophin-1 like protein isoform a,Homo sapiens mRNA for KIAA0458 protein, partial cds.,
Run Code Online (Sandbox Code Playgroud)

我尝试了下面的代码,但它似乎没有删除重复的值.

awk ' 
BEGIN { FS="\t" } ;
{
  split($2, valueArray,",");
  j=0;
  for (i in valueArray) 
  { 
    if (!( valueArray[i] in duplicateArray))
    {
      duplicateArray[j] = valueArray[i];
      j++;
    }
  };
  printf $1 "\t";
  for (j in duplicateArray) 
  {
    if (duplicateArray[j]) {
      printf duplicateArray[j] ",";
    }
  }
  printf "\t";
  print $3

}' knownGeneFromUCSC.txt
Run Code Online (Sandbox Code Playgroud)

如何正确删除第2列中的重复项?

Pau*_*ce. 6

您的脚本仅作用于文件中的第二个记录(行),因为NR==2.我把它拿出来了,但它可能就是你想要的.如果是这样,你应该把它放回去.

所述in的存在操作者检查索引,而不是值,所以由duplicateArray一个关联数组*从用这些值valueArray作为其指标.这样就不必在循环内的循环中迭代两个数组.

split声明将"WDR78,WDR78,WDR78"视为四个字段而不是三个,因此我添加了一个if以防止它打印空值,如果if不存在则会导致打印",WDR78" .

*实际上,AWK中的所有数组都是关联的.

awk '
BEGIN { FS="\t" } ;
{
  split($2, valueArray,",");
  j=0;
  for (i in valueArray)
  { 
    if (!(valueArray[i] in duplicateArray))
    { 
      duplicateArray[valueArray[i]] = 1
    }
  };
  printf $1 "\t";
  for (j in duplicateArray)
  {
    if (j)    # prevents printing an extra comma
    {
      printf j ",";
    }
  }
  printf "\t";
  print $3
  delete duplicateArray    # for non-gawk, use split("", duplicateArray)
}'
Run Code Online (Sandbox Code Playgroud)