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できません。deletesplit("", 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コマンドの出力を2番目にパイプすることもできます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 に答える