【问题标题】:Remove duplicate words/string from a tab separated file从制表符分隔的文件中删除重复的单词/字符串
【发布时间】:2012-06-05 16:54:08
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 不,但制表符和逗号很重要。

标签: linux sed awk


【解决方案1】:
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)

【讨论】:

  • 非常感谢丹尼斯。你的剧本就像一个魅力!但是在输出选项卡中消失了,我得到一个带空格的逗号。名字,约翰,cnn,mac,汤米,帕特里克,ngc,发现,亚当
  • @Kaartz:这很奇怪。它对我来说可以正常工作。仔细检查以确保输入文件有标签。另外,请确保您使用的是我回答中脚本的当前版本。在发布第一个没有它的版本后,我迅速添加了delim 功能。您使用的是哪个版本的 AWK?什么操作系统/发行版?
  • 我通过添加 printf "%s\t\t\t\t", $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 文件。

城市也是如此。我假设顺序对你来说并不重要。

【讨论】:

  • sort | uniq 在大多数 linux 机器上可以替换为 sort -u。我不知道它在 Unix 上的可移植性如何,它可以在我的 Solaris 机器上运行。
【解决方案3】:

这可能对你有用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2013-08-11
    • 2021-01-14
    相关资源
    最近更新 更多