从CSV文件中删除重复的条目


13

我有一个[csv]文件,该文件具有重复的重复数据,即相同的数据打印了两次。我试过使用sort的uniqsort myfile.csv | uniq -u但是中没有变化myfile.csv,我也试过sudo sort myfile.csv | uniq -u但没有区别。

所以目前我的csv文件看起来像这样

a
a
a
b
b
c
c
c
c
c

我想看起来像

a
b
c

排序-u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar

根据man sort,您无法“就地”排序。
Archemar

您也可以尝试不依赖终端。你可以尝试,而不是这个在线工具textmechanic.com/text-tools/basic-text-tools/...
阿米娜Nuraini

Answers:


16

之所以myfile.csv不变,是因为-u选项uniq将打印唯一的行。在此文件中,所有行都是重复的,因此将不会打印出来。

但是,更重要的是,不会保存输出,myfile.csv因为uniq只会将输出打印到stdout(默认为控制台)。

您将需要执行以下操作:

$ sort -u myfile.csv -o myfile.csv

这些选项表示:

  • -u -仅保留唯一的行
  • -o -输出到此文件而不是 stdout

您应该查看man sort更多信息。


3

如Belmin所示,排序很棒。他的答案最适合未排序的数据,而且很容易记住和使用。

但是,它也是易失的,因为它会改变输入的顺序。如果您绝对需要按相同顺序处理数据,但要删除以后的重复项,awk可能会更好。

$ cat myfile.csv
c
a
c
b
b
a
c


$ awk '{if (!($0 in x)) {print $0; x[$0]=1} }' myfile.csv
c
a
b

奇怪的情况,但确实时有发生。

另外,如果您在查看数据时已经对数据进行了排序,则可以运行uniq。

$ cat myfile.csv 
a
a
a
b
b
c
c
c
c
c


$ uniq myfile.csv 
a
b
c

我的两个建议的缺点是您需要使用一个临时文件并将其复制回。


2

uniq -u仅打印唯一行。您的输入没有唯一的行,因此uniq -u什么也不打印。您只需要sort

sort -u myfile.csv

2

如果您想维护文件的顺序(未排序),但仍删除重复项,也可以这样做

awk '!v[$1]++' /tmp/file

例如

d
d
a
a
b
b
c
c
c
c
c

它将输出

d
a
b
c

您能否扩展语法?
Sopalajo de Arrierez,

将字符串放在哈希中。如果该字符串在哈希中不存在,则打印。
NinjaGaiden
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.