ôi
awk '!a[$1]++' file
Đây là một cách viết rất cô đọng này:
awk '{if(! a[$1]){print; a[$1]++}}' file
Vì vậy, nếu trường đầu tiên hiện tại ( $1
) không nằm trong a
mảng, hãy in dòng và thêm trường thứ 1 vào a
. Lần sau chúng ta thấy trường đó, nó sẽ nằm trong mảng và do đó sẽ không được in.
Perl
perl -ane '$k{$F[0]}++ or print' file
hoặc là
perl -ane 'print if !$k{$F[0]}++' file
Điều này về cơ bản là giống như awk
một. Các -n
nguyên nhân perl để đọc dòng tệp đầu vào theo dòng và áp dụng tập lệnh được cung cấp -e
cho mỗi dòng. Các -a
sẽ tự động tách mỗi dòng trên khoảng trắng và lưu các lĩnh vực kết quả là @F
mảng. Cuối cùng, trường đầu tiên được thêm vào %k
hàm băm và nếu nó chưa có ở đó, dòng được in. Điều tương tự có thể được viết là
perl -e 'while(<>){
@F=split(/\s+/);
print unless defined($k{$F[0]});
$k{$F[0]}++;
}' file
Coreutils
rev file | uniq -f 1 | rev
Phương pháp này hoạt động bằng cách trước tiên đảo ngược các dòng file
sao cho nếu một dòng là 12 345 thì bây giờ sẽ là 543 21. Sau đó, chúng ta sử dụng uniq -f 1
để bỏ qua trường đầu tiên, nghĩa là cột 543 nằm trong. Có các trường trong file
. Sử dụng uniq
ở đây có tác dụng lọc ra bất kỳ dòng trùng lặp nào, chỉ giữ lại mỗi dòng. Cuối cùng, chúng tôi đặt các dòng trở lại trật tự ban đầu của họ với một đảo ngược khác.
Sắp xếp GNU (theo đề xuất của @ StéphaneChazelas)
sort -buk1,1
Các -b
cờ lờ hàng đầu khoảng trắng và các -u
phương tiện in ruộng chỉ độc đáo. Các bit thông minh là -k1,1
. Các -k
lá cờ đặt trường để sắp xếp trên. Nó có định dạng chung -k POS1[,POS2]
có nghĩa là chỉ nhìn vào các trường POS1
thông qua POS2 khi sắp xếp. Vì vậy, -k1,1
có nghĩa là chỉ nhìn vào lĩnh vực 1. Tùy thuộc vào dữ liệu của bạn, bạn có thể muốn thêm một trong các tùy chọn sau:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value