2014-04-03 24 views
7

Với bảng sauLàm cách nào để xóa các hàng trùng lặp dựa trên giá trị cột?

123456.451 entered-auto_attendant 
123456.451 duration:76 real:76 
139651.526 entered-auto_attendant 
139651.526 duration:62 real:62` 
139382.537 entered-auto_attendant 

Sử dụng một kịch bản bash shell dựa trên Linux, tôi muốn xóa tất cả các hàng dựa trên giá trị của cột 1 (Một với số lượng dài). Có xem xét rằng con số này là một biến số

Tôi đã thử với

awk '{a[$3]++}!(a[$3]-1)' file

sort -u | uniq 

Nhưng tôi không nhận được kết quả đó sẽ là một cái gì đó như thế này, làm một so sánh giữa tất cả các giá trị của cột đầu tiên, xóa tất cả các bản sao và hiển thị nó

123456.451 entered-auto_attendant 
139651.526 entered-auto_attendant 
139382.537 entered-auto_attendant 

Trả lời

6

bạn không đưa ra kết quả mong đợi, tính năng này có phù hợp với bạn không?

awk '!a[$1]++' file 

với dữ liệu của bạn, kết quả là:

123456.451 entered-auto_attendant 
139651.526 entered-auto_attendant 
139382.537 entered-auto_attendant 

và điều này dòng in chỉ có duy nhất dòng column1:

awk '{a[$1]++;b[$1]=$0}END{for(x in a)if(a[x]==1)print b[x]}' file 

đầu ra:

139382.537 entered-auto_attendant 
+0

+1: Lỗi nhỏ - 'b [$ 1]' phải là 'b [x]' trong khối 'END'. –

+0

đó là lỗi đánh máy, thx, cố định – Kent

+0

Và nếu tôi cần tất cả các cột bắt đầu bằng 139382.537 (trong trường hợp này) – user3494949

1

Sử dụng awk:

awk '!($1 in a){a[$1]++; next} $1 in a' file 
123456.451 duration:76 real:76 
139651.526 duration:62 real:62 
+0

Tốt, nhưng tôi muốn có tất cả các bản ghi bắt đầu bằng cùng cột, như trong mô tả, trong trường hợp đó là 2 bản ghi có cùng cột đầu tiên, nhưng đôi khi có thể là ba hoặc nhiều hơn – user3494949

+0

Isn Đó là điều mà câu trả lời này đã làm. Nó đang in tất cả các dòng trùng lặp. Sản lượng dự kiến ​​của bạn là gì? – anubhava

2

uniq, theo mặc định, so sánh toàn bộ dòng. Vì các dòng của bạn không giống nhau, chúng không bị xóa.

Bạn có thể sử dụng sort để thuận tiện sắp xếp theo lĩnh vực đầu tiên và cũng có thể xóa các bản sao của nó:

sort -t ' ' -k 1,1 -u file 
  • -t ' ' lĩnh vực được ngăn cách bởi không gian
  • -k 1,1: chỉ nhìn vào lĩnh vực đầu tiên
  • -u: xóa các bản sao

Ngoài ra, bạn có thể đã thấy mẹo awk '!a[$0]++' để loại bỏ các dòng. Bạn có thể thực hiện việc khấu trừ này trên cột đầu tiên chỉ sử dụng awk '!a[$1]++'.

1

thử lệnh này

awk '!x[$1]++ { print $1, $2 }' file 
Các vấn đề liên quan