从制表符分隔文件中删除重复的单词/字符串

时间:2012-06-05 16:54:08

标签: linux sed awk

我想使用Linux命令从大型制表符分隔文件中删除重复的单词/字符串。

names            john, cnn, mac, tommy, mac, patrick, ngc, discovery, john, cnn, adam, patrick
cities            san jose, santa clara, san franscisco, new york, san jose, santa clara

以上是文件格式,我想在删除重复的单词后保留标签和逗号。

names            john, cnn, mac, tommy, patrick, ngc, discovery, adam
cities            san jose, santa clara, san franscisco, new york

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

awk 'BEGIN {
         FS = ", |\t"
     }
     {
          printf "%s\t", $1
          delim = ""
          for (i = 2; i <= NF; i++) {
              if (! ($i in seen)) {
                  printf "%s%s", delim, $i
                  delim = ", "
              }
              seen[$i]
          }
          printf "\n"
          delete seen
     }' inputfile

如果你没有使用GNU AWK(gawk),那么你不能delete数组,而是使用split("", array)

答案 1 :(得分:2)

sedawk本身并不是特别适合这种情况。 uniq更好。

首先将名称拉出到另一个文件中,例如names。您可以使用sed:

head -1 inputfile | sed 's/^names\s*//g' > names

所以现在名字包含john, cnn, mac, tommy, mac, patrick, ngc, discovery, john, cnn, adam, patrick

然后使用:

awk 'BEGIN{RS=","}{print $0}' names | sort | uniq | awk 'BEGIN{ORS=","}{print $0}'

输出为adam,cnn,discovery,john,mac,ngc,patrick,tommy,。如果您想使用sed,也可以删除最后一个逗号。当然,您也可以将head命令的输出传递给第二个awk。在这种情况下,您将不需要中间names文件。

同样适用于城市。我假设订单对你来说并不重要。

答案 2 :(得分:0)

这可能对您有用:

sed -i ':a;s/\(\(\<[^,]*\),.*\)\( \2,*\)/\1/;ta;s/,$//' /tmp/a