grep nhiều dòng với số lượng và chuỗi duy nhất


0

Mẫu.csv

DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,abc,FAILURE,12,24,45
DSN1,def,FAILURE,12,78,65
DSN1,abc,FAILURE,12,24,45

tôi cần số lần thất bại trong mẫu trên .csv với phản hồi là

abc 5
def 2

nhưng tôi không đề cập đến abc / def trong kịch bản. bởi vì tôi đã đưa ra một kịch bản mẫu trong trường hợp của tôi, nhiều chuỗi như abc đang ở đó nên tôi cần chuỗi đó và tính thất bại.

vui lòng gợi ý cho tôi

Cảm ơn trước


Đoạn trích CSV mẫu đó có số lượng trường khác nhau trên mỗi dòng; Bạn có chắc chắn đó là cách tập tin được định dạng?
DopeGhoti

thiếu đánh dấu thích hợp
Ricky Beam

Câu trả lời:


3

Một giải pháp đơn giản là sử dụng đường ống sau:

<Sample.csv grep '^[^,]*,[^,]*,FAILURE' | cut -d, -f2 | sort | uniq -c
  • grep sẽ trích xuất các dòng với FAILURE trong cột thứ ba
  • cut sẽ trích xuất cột (dấu phân cách , số cột 2 )
  • sort sẽ sắp xếp cột được trích xuất (Các giá trị tương tự sẽ nằm cạnh nhau.)
  • uniq sẽ loại bỏ các giá trị lặp lại, -c tùy chọn sẽ hiển thị số lượng của mỗi giá trị duy nhất

Bạn cũng có thể chèn các bộ lọc khác vào đường ống nếu cần. (ví dụ grep lúc bắt đầu).


1

Nhận xét của Ricky là cách tôi sẽ làm điều đó, nhưng nếu bạn muốn một giải pháp cụ thể cho grep, bạn có thể làm như sau:

$ for i in {abc,def}; do echo -n "$i: "; grep -c $i input.txt; done;

điều này sẽ tạo ra dự kiến:

abc:5
def:2

Cập nhật

Nếu bạn không muốn đưa các khóa tìm kiếm vào vòng lặp for, tôi không thấy cách thực hiện đơn giản chỉ bằng grep.

Bạn có thể làm điều đó với awk mặc dù.

awk 'BEGIN{FS=","}//{a[$2]++}END{for(x in a) print x,a[x]}' test.txt

Giải trình:

FS = "," - đặt dấu tách bản ghi thành dấu phẩy

// - khớp tất cả các dòng

Chúng tôi tạo ra một mảng kết hợp được gọi là 'a'

a [$ 2] ++ - mỗi mẫu phù hợp, chúng tôi lấy cột thứ 2 và số tăng

END {..} - khối này được chạy khi hoàn thành tất cả khớp.                      chúng tôi lặp đi lặp lại trên tất cả các yếu tố in khóa và đếm.


trong vòng lặp tôi không muốn đề cập đến bất kỳ chuỗi. chuỗi nên nhiều hơn 2 tôi cần chuỗi động với số đếm.
manu2711

Bạn nên thêm FAILURE làm điều kiện để đếm, ví dụ: $3 == "FAILURE" { a[$2]++ } ....
Thor

-2

xin vui lòng tìm cùng:

awk < Sample.txt -F',' '{print $2}' | sort |uniq -c| grep "FAILURE"

Cảm ơn câu trả lời của bạn :)


1
Đây có phải là để trả lời câu hỏi của riêng bạn? Nếu vậy, sẽ tốt hơn nếu bạn có thể thêm một lời giải thích ngắn.
Der Hochstapler

Điều này sẽ không hoạt động như chuỗi FAILURE không xuất hiện trong cột thứ hai trong ví dụ của bạn. ( grep có thể ở đầu ống mặc dù) Bạn cũng nên thêm một số lời giải thích.
pabouk
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.