2012-11-02 35 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