3

我想使用 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

任何帮助,将不胜感激。

4

3 回答 3

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)而是使用。

于 2012-06-05T17:06:38.223 回答
2

sed并且awk它们本身并不是特别适合这个。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文件。

城市也一样。我假设顺序对你来说并不重要。

于 2012-06-05T17:02:47.760 回答
0

这可能对您有用:

sed -i ':a;s/\(\(\<[^,]*\),.*\)\( \2,*\)/\1/;ta;s/,$//' /tmp/a
于 2012-06-05T21:14:36.303 回答