【问题标题】:Find the repeating words in a column and delete查找列中重复的单词并删除
【发布时间】:2021-02-27 00:38:12
【问题描述】:

我有数据文件

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

我想delete the repeating terms present in column 2 and column 3 例如。在第 2 列的第一行中,CP、D、SE、SI 再次重复,因此它应该在第 3 列中被删除,Q 被重复,所以重复的应该被删除。

我用 awk 试过

awk '!seen[$2]++' file 

但是出现错误找不到[

【问题讨论】:

  • 重复的词总是在同一个顺序吗?
  • 是的,它们总是以相同的顺序重复

标签: awk sed


【解决方案1】:

你可以使用这个awk:

awk 'function dedup(col,   a, seen, i, s) {split($col, a, /,/); s=""; for (i=1; i in a; ++i) if (!seen[a[i]]++) s = s (s == "" ? "" : ",") a[i]; $col=s;} {dedup(2); dedup(3)} 1' file | column -t

AND  (CP),(D),(SE),(SI)      (Q)   1
OR   (CP),(D),(E),(SE),(SI)  (Q)   1
DFF  (CP),(D),(E)            (QN)  1

展开形式:

awk 'function dedup(col,   a, seen, i, s) {
   split($col, a, /,/)
   s = ""
   for (i=1; i in a; ++i)
      if (!seen[a[i]]++)
         s = s (s == "" ? "" : ",") a[i]
    $col = s
}
{
   dedup(2)
   dedup(3)
} 1' file | column -t

column -t 仅用于表格输出。

【讨论】:

  • 这适用于(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)。如果您显示您的实际数据,那么我可以再次生成输出。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    根据您显示的示例,请尝试以下操作。用 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.
    

    【讨论】:

      猜你喜欢
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2021-08-18
      • 2019-11-13
      相关资源
      最近更新 更多