Awk 在列中找到重复的单词并删除

Awk 在列中找到重复的单词并删除,awk,sed,Awk,Sed,我有一个包含数据的文件 AND (CP),(D),(SE),(SI),(CP),(D),(SE),(SI) (Q),(Q) 1 OR (CP),(D),(E),(SE),(SI),(CP),(D),(E),(SE),(SI) (Q),(Q) 1 DFF (CP),(D),(E),(CP),(D),(E) (QN),(QN) 1 我希望输出为 AND (CP),(D),(SE),(SI)

我有一个包含数据的文件

AND (CP),(D),(SE),(SI),(CP),(D),(SE),(SI)            (Q),(Q)    1
OR  (CP),(D),(E),(SE),(SI),(CP),(D),(E),(SE),(SI)    (Q),(Q)    1
DFF (CP),(D),(E),(CP),(D),(E)                        (QN),(QN)  1
我希望输出为

AND (CP),(D),(SE),(SI)          (Q)  1
OR  (CP),(D),(E),(SE),(SI)      (Q)  1
DFF (CP),(D),(E)                (QN) 1
我想删除第2列和第3列中出现的重复术语,如第2列第一行中的CP、D、SE、SI再次重复,因此应删除第3列中相同的重复术语Q重复,因此重复的一个应删除

我用awk试过了

awk '!seen[$2]++' file 
但是找不到获取错误[

您可以使用此awk:

awk'函数dedupcol,a,seen,i,s{split$col,a,/,/;s=;for i=1;i在a;++i if!seen[a[i]++s=s==?:,a[i];$col=s;}{dedup2;dedup3}1'文件|列-t 和CP,D,SE,siq1 或CP、D、E、SE、SI Q 1 DFF CP、D、E QN 1 扩展形式:

awk’函数包括col、a、seen、i、s{ 拆分$col,a,// s= 对于i=1;a中的i;++i 如果!看到[a[i]]++ s=s=s=?:,a[i] $col=s } { 重复数据2 重复数据3 }1'文件|列-t
列-t仅用于表格输出。

根据所显示的示例,请尝试以下内容。使用GNU awk编写并测试。创建了一个名为removeDup的函数,只需将所有字段号传递到要删除重复项的位置,如2,3,以删除第2和第3个字段中的重复项,然后就可以设置好

awk '
BEGIN{ s1="," }
function removeDup(fields){
  num=split(fields,fieldNum,",")
  for(k=1;k<=num;k++){
    delete arr1
    delete arrVal1
    val1=num1=""
    num1=split($fieldNum[k],arr1,",")
    for(i=1;i<=num1;i++){
      if(!arrVal1[arr1[i]]++){
        val1=(val1?val1 s1:"")arr1[i]
      }
    }
    $fieldNum[k]=val1
  }
}
{
  removeDup("2,3")
}
1
' Input_file
说明:增加对以上内容的详细说明

awk '                                   ##Starting awk program from here.
BEGIN{ s1="," }                         ##Setting s1 value to comma in BEGIN section.
function removeDup(fields){             ##Creating function removeDup passing fields to it.
  num=split(fields,fieldNum,",")        ##Splitting fields into fieldNum array here.
  for(k=1;k<=num;k++){                  ##Running for loop till value of num here.
    delete arr1                         ##Deleting arr1 here.
    delete arrVal1                      ##Deleting arrVal1 here.
    val1=num1=""                        ##Nullify val1 and num1 here.
    num1=split($fieldNum[k],arr1,",")   ##Splitting field(fieldNum value) into arr1 here.
    for(i=1;i<=num1;i++){               ##Running for loop till value of num1 here.
      if(!arrVal1[arr1[i]]++){          ##Checking condition if current arr1 values is NOT present in arrVal1 then do following.
        val1=(val1?val1 s1:"")arr1[i]   ##Creating val1 here and keep on adding value to it.
      }
    }
    $fieldNum[k]=val1                   ##Assigning currnet field value as val1 value here.
  }
}
{
  removeDup("2,3")                      ##Calling removeDup function in main program with 2nd and 3rd field numbers passed to it.
}
1
' Input_file                            ##mentioning Input_file name here.

如果重复的部分始终完全相同,并且重复了两次,则可以使用sed:

sed -E 's/ (.+),\1 / \1 /g'

重复的术语总是以相同的顺序吗?是的,总是以相同的顺序重复它们非常聪明!…这适用于CP、D、E形式的输入,但当输入为CDN、CP、D、SE、SI、CDN、CP、D、SE、SI时,没有不正确的更改。它将CDN、CP、D、SE、SI、CDN、CP、D、SE、SI转换为CDN、CP、D、SE、SI。如果您显示实际数据,我可以生成输出再一次