2012-11-02 34 views
4

我有一个文件,该文件是格式如下:删除字段中的所有重复条目

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脚本解决方案来适应管道与其他文本操作管道我正在做这个文件。

谢谢!

+0

你有什么试过?祝你好运。 – shellter

回答

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 
+0

优秀!完美工作。我在awk中尝试了一些数组的东西,但没有接近任何解决方案。 – JoshuaA

2

这可能为你工作(GNU SED):

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

这产生了一些奇结果: '文本号数A; A; A; A; A; A 文本号数A 文本号数B 文本号数B 文本数号C; C; C'; C ; D; C; C; C; C 文本编号C; D' – JoshuaA

+0

@JoshuaA也许该文件是制表符分隔不是空格,我会修改解决方案来迎合两者。 – potong

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. /[[:alpha:]]$/可以替换为/[^[:space:]]+$/以匹配多个非空格字符而不是单个字母表。

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

2
假设

制表符分隔的输入,则可以做到这一点像这与GNU平行:

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