删除字段中的所有重复条目

时间:2012-11-02 18:55:47

标签: bash sed awk

我有一个格式如下的文件:

text   number   number   A;A;A;A;A;A
text   number   number   B
text   number   number   C;C;C;C;D;C;C;C;C

我想要做的是删除第四列中条目的所有重复以最终结果:

text   number   number   A
text   number   number   B
text   number   number   C;D

我更喜欢使用bash脚本来获得一个解决方案,以适应我正在对此文件进行其他文本操作的管道。

谢谢!

4 个答案:

答案 0 :(得分:3)

可以使用awk实现此目的。将字段4拆分为数组使用;第一

awk '{delete z; d=""; split($4,arr,";");for (k in arr) z[arr[k]]=k; for (l in z) d=d";"l; print($1,$2,$3,substr(d, 2))}' file_name

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed 's/.*\s/&\n/;h;s/.*\n//;:a;s/\(\([^;]\).*\);\2/\1/;ta;H;g;s/\n.*\n//' file

答案 2 :(得分:2)

假设以制表符分隔的输入,您可以使用GNU parallel进行这样的操作:

parallel -C '\t' c4='$(echo {4} | tr ";" "\n" | sort -u | head -c-1 | tr "\n" ";");' \
                 echo -e '"{1}\t{2}\t{3}\t$c4"' :::: infile

输出:

text    number  number  A
text    number  number  B
text    number  number  C;D

答案 3 :(得分:1)

这可能也有用

awk -F";" '{
              delete words
              match($1,/[[:alpha:]]$/)
              words[substr($1,RSTART,RLENGTH)]++
              printf "%s",$1
              for (i=2;i<=NF;i++){
                if (!words[$i]++) printf ";%s",$i
              }
              printf "\n"
           }' file

注意:

  1. 由于;用作字段分隔符,因此A;A;A;A;A;A

  2. 之前的列数(或用于这些列的分隔符)无关紧要
  3. /[[:alpha:]]$/可以替换为/[^[:space:]]+$/,以匹配多个非空格字符,而不是单个字母。

  4. if (!words[$i]++) printf ";%s",$i打印列/字符(如果它不存在作为关联数组words的键,即如果words[$i]为0。

    < / LI>