Xóa các mục trùng lặp khỏi tệp CSV


13

Tôi đã có một tệp [csv] với dữ liệu trùng lặp được in lại, tức là cùng một dữ liệu được in hai lần. Tôi đã thử sử dụng uniq bằng cách sort myfile.csv | uniq -utuy nhiên không có thay đổi nào myfile.csv, tôi cũng đã thử sudo sort myfile.csv | uniq -unhưng không có gì khác biệt.

Vì vậy, hiện tại tập tin csv của tôi trông như thế này

a
a
a
b
b
c
c
c
c
c

Tôi muốn trông giống như nó

a
b
c

sắp xếp -u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar

theo man sort, bạn không thể sắp xếp "tại chỗ".
Archemar

Bạn cũng có thể cố gắng không dựa vào thiết bị đầu cuối. Bạn có thể dùng thử công cụ trực tuyến này thay vì textmechanic.com/text-tools/basic-text-tools/ mẹo
Aminah Nuraini

Câu trả lời:


16

Lý do myfile.csvkhông thay đổi là vì -utùy chọn uniqsẽ chỉ in các dòng duy nhất. Trong tệp này, tất cả các dòng là trùng lặp để chúng sẽ không được in ra.

Tuy nhiên, quan trọng hơn, đầu ra sẽ không được lưu vào myfile.csvuniqsẽ chỉ in ra stdout(theo mặc định, bảng điều khiển của bạn).

Bạn sẽ cần phải làm một cái gì đó như thế này:

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

Các tùy chọn có nghĩa là:

  • -u - chỉ giữ các dòng duy nhất
  • -o - xuất ra tệp này thay vì stdout

Bạn nên xem man sortđể biết thêm thông tin.


3

Như Belmin đã chỉ ra, sắp xếp là tuyệt vời. Câu trả lời của anh ấy là tốt nhất cho dữ liệu chưa được sắp xếp, và thật dễ nhớ và dễ sử dụng.

Tuy nhiên, nó cũng không ổn định, vì nó thay đổi thứ tự của đầu vào. Nếu bạn thực sự cần phải có dữ liệu theo cùng một thứ tự nhưng loại bỏ các bản sao sau này, awk có thể tốt hơn.

$ 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

Trường hợp cạnh kỳ lạ, nhưng nó xuất hiện theo thời gian.

Ngoài ra, nếu dữ liệu của bạn đã được sắp xếp khi bạn chọc vào nó, bạn có thể chạy uniq.

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


$ uniq myfile.csv 
a
b
c

Hạn chế cho cả hai đề xuất của tôi là bạn cần sử dụng một tệp tạm thời và sao chép lại.


2

uniq -u chỉ in các dòng duy nhất. Đầu vào của bạn không có dòng duy nhất, vì vậy uniq -uin không có gì. Bạn chỉ cần sort:

sort -u myfile.csv

2

Nếu bạn muốn duy trì thứ tự của tệp (không được sắp xếp) nhưng vẫn loại bỏ trùng lặp, bạn cũng có thể làm điều này

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

Ví dụ

d
d
a
a
b
b
c
c
c
c
c

Nó sẽ xuất

d
a
b
c

Bạn có thể vui lòng mở rộng về cú pháp?
Sopalajo de Arrierez

Đặt chuỗi trong một hàm băm. Nếu chuỗi KHÔNG tồn tại trong hàm băm thì in ra.
NinjaGaiden
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.