如何保持文件的格式,如果你使用uniq命令(带壳)?
-
22-07-2019 - |
题
为了使用uniq命令,你必须先解决您的文件。
但我在文件中,信息的顺序很重要,所以我怎么能保持原始文件的格式,但仍然摆脱重复的内容?
解决方案
另一个AWK版本:
awk '!_[$0]++' infile
其他提示
此awk
保持第一发生。算法相同的算法其他答案使用:
awk '!($0 in lines) { print $0; lines[$0]; }'
下面是一个只需要存储重复的行使用awk
(相对于所有行):
sort file | uniq -d | awk '
FNR == NR { dups[$0] }
FNR != NR && (!($0 in dups) || !lines[$0]++)
' - file
另外还有“行号,双排序”的方法。
nl -n ln | sort -u -k 2| sort -k 1n | cut -f 2-
您可以在文件的排序版本上运行的uniq -d找到重复的行,然后运行一些脚本,说:
if this_line is in duplicate_lines {
if not i_have_seen[this_line] {
output this_line
i_have_seen[this_line] = true
}
} else {
output this_line
}
仅使用uniq的和grep:
创建d.sh:强>
#!/bin/sh
sort $1 | uniq > $1_uniq
for line in $(cat $1); do
cat $1_uniq | grep -m1 $line >> $1_out
cat $1_uniq | grep -v $line > $1_uniq2
mv $1_uniq2 $1_uniq
done;
rm $1_uniq
示例:强>
./d.sh infile
您可以使用一些可怕为O(n ^ 2)的东西,这样的(伪码):
file2 = EMPTY_FILE
for each line in file1:
if not line in file2:
file2.append(line)
这是潜在的相当缓慢的,特别是如果在击水平实现。但如果你的文件是相当短的,它可能会工作得很好,并会快速实施(not line in file2
然后只是grep -v
,依此类推)。
否则可能当然代码了一个专门的程序,在存储器中使用一些更高级的数据结构,以加快速度。
for line in $(sort file1 | uniq ); do
grep -n -m1 line file >>out
done;
sort -n out
第一执行排序,
对于每个的uniqe值的grep用于第一匹配(-m1)
和保持的行号
排序的行号输出数字(-n)。
则然后可删除行#的使用sed或AWK
不隶属于 StackOverflow