我想使用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
任何帮助都将不胜感激。
答案 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)
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
文件。
同样适用于城市。我假设订单对你来说并不重要。
答案 2 :(得分:0)
这可能对您有用:
sed -i ':a;s/\(\(\<[^,]*\),.*\)\( \2,*\)/\1/;ta;s/,$//' /tmp/a