it-swarm-vi.com

Làm thế nào để chỉ nhận được kết quả duy nhất mà không phải sắp xếp dữ liệu?

$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

Kết quả mà tôi cần là hiển thị tất cả các dòng từ tệp gốc loại bỏ tất cả các bản sao (không chỉ các bản liên tiếp), trong khi duy trì thứ tự ban đầu của các câu lệnh trong tệp.

Ở đây, trong ví dụ này, kết quả mà tôi thực sự đang tìm kiếm là

aaaaaa
cccccc
bbbbbb

Làm cách nào tôi có thể thực hiện thao tác uniq tổng quát này?

43
Lazer
Perl -ne 'print unless $seen{$_}++' data.txt

Hoặc, nếu bạn phải có sử dụng vô dụng cat :

cat data.txt | Perl -ne 'print unless $seen{$_}++'

Đây là bản dịch awk, dành cho các hệ thống thiếu Perl:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
57
cjm

john có một công cụ gọi là unique:

[email protected] % cat data.txt | unique out
[email protected] % cat out
aaaaaa
cccccc
bbbbbb

Để đạt được điều tương tự mà không cần các công cụ bổ sung trong một dòng lệnh thì phức tạp hơn một chút:

[email protected] % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl in số dòng ở phía trước các dòng, vì vậy nếu chúng ta sort/uniq đằng sau chúng, chúng ta có thể khôi phục thứ tự ban đầu của các dòng. sed chỉ xóa các số dòng sau đó;)

13
binfalse

Tôi thích sử dụng này:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n thêm số dòng,

sort --key=2.1 -b -u sắp xếp trên trường thứ hai (sau số dòng được thêm vào), bỏ qua khoảng trống hàng đầu, giữ các dòng duy nhất

sort -n sắp xếp theo thứ tự số nghiêm ngặt

cut -c8- giữ tất cả các ký tự từ cột 8 đến EOL (nghĩa là bỏ qua các số dòng chúng tôi đưa vào)

6
menkus

Perl có một mô-đun mà bạn có thể sử dụng bao gồm một hàm gọi là uniq. Vì vậy, nếu bạn đã tải dữ liệu của mình trong một mảng trong Perl, bạn chỉ cần gọi hàm như thế này để làm cho nó là duy nhất, nhưng vẫn duy trì thứ tự ban đầu.

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Bạn có thể đọc thêm về mô-đun này tại đây: Danh sách :: MoreUtils

2
slm