Unix 如何使用awk脚本删除重复列

Unix 如何使用awk脚本删除重复列,unix,awk,sed,gawk,Unix,Awk,Sed,Gawk,我有以下几点 444, 1234, (1234), 3453534, 43534543 我希望输出是 444, (1234), 3453534, 43534543 我知道awk是最好的解决方案 但我无法想出解决办法 新行可以在任意位置放置唯一列。只需要括号中的值 总之,如果是重复的,我们需要去掉没有括号的值 e、 g.如果我们的列为: (1234) 1234 ----> we want it to be (1234) 非常感谢如果我能很好地理解每个输入行,那么必须解析所有值字段,然后

我有以下几点

444, 1234, (1234), 3453534, 43534543
我希望输出是

444, (1234), 3453534, 43534543
我知道awk是最好的解决方案

但我无法想出解决办法

新行可以在任意位置放置唯一列。只需要括号中的值

总之,如果是重复的,我们需要去掉没有括号的值

e、 g.如果我们的列为:

(1234) 1234 ----> we want it to be (1234)

非常感谢

如果我能很好地理解每个输入行,那么必须解析所有值字段,然后跳过所有值字段。我假设除最后一个字段外,所有字段都以逗号字符结尾

以下是我的建议:

awk ' { delete a; s="" # Reset tmp values
  #Search for all (...) fields
  for(i=1;i<=NF;++i) {
    if (match($i,/^\((.*)\),?$/)) {
        num=$i; gsub(/(^\(|\),?$)/,"",num);
        a[num","]=1;
    }
  }
  #Skip all fields contained by a hash
  for(i=1;i<=NF;++i) if(!(($i)(i<NF?"":",") in a)) s=s FS $i;
  # Trim leading field separator and trailing comma (if exists)
  gsub("(^"FS"|,$)","",s);
  print s;
}' inputfile
输出:

444, (1234), 3453534, 43534543
444, (1235), 1234, 3453534, 43534543
444, (1235), 3453534, 43534543, (1234)
444, 1235, 1235, 1235, 1234, 3453534, 43534543
444, (1234)
444, (1235)

我希望这有点帮助

如果我做出以下假设:

每行只有一个唯一的列 分隔符在行中的所有位置都相同,但末尾除外:$ 下面是一个用于删除问题中所述重复项的awk可执行文件:

#!/usr/bin/awk -f

BEGIN {FS=", "}

match($0, /\([[:alnum:]]*\)/) {
  p=substr($0, RSTART, RLENGTH)   # pattern to match
  gsub(p "(" FS "|$){1}", "")     # remove duplicates from $0
  sub(FS "$", "")                 # clean up trailing delimiters
}

47
或者,当删除每行只有一个唯一列的假设时:

#!/usr/bin/awk -f

BEGIN {FS=", "}

{ 
  for(i=1;i<=NF;i++) {
    if(match($0, "\\(" $i "\\)")) { 
      p=substr($0, RSTART, RLENGTH)   # pattern to match
      gsub(p "(" FS "|$){1}", "")     # remove duplicates from $0
    }
  }
  sub(FS "$", "")                     # clean up trailing delimiters
}

47

在每种情况下,都会使用gsub更新$0以删除重复项,而不是对单个字段进行操作,47的计算结果为true以打印$0,无论它是否被更改。

括号是数据的一部分吗?1234是1234的一个副本,?如果它们打印在括号内条目所在的插槽中,或者第一个无括号条目出现在插槽中或其他地方。老实说,只要稍加努力,您就可以在样本输入和预期输出方面做得更好,以显示问题的复杂性。nirvanastack请更新您的问题,以显示样本输入,包括我问过的所有案例以及您知道的我没想过要问的其他案例,与预期输出相匹配@天网-不,这个问题的答案对于这个问题和那个问题来说都太复杂了,我只能一眼就知道。你想要1234、1234、1234、1234行的结果是什么?逗号后面的空格真的在文件中吗?非常感谢你的努力。@nirvanastack:这是你需要的吗?
#!/usr/bin/awk -f

BEGIN {FS=", "}

{ 
  for(i=1;i<=NF;i++) {
    if(match($0, "\\(" $i "\\)")) { 
      p=substr($0, RSTART, RLENGTH)   # pattern to match
      gsub(p "(" FS "|$){1}", "")     # remove duplicates from $0
    }
  }
  sub(FS "$", "")                     # clean up trailing delimiters
}

47