xóa các dòng trống trong màn hình awk


10

Tôi đã cố gắng tìm ra một giải pháp cho câu hỏi này . Tôi muốn sử dụng awkcho giải pháp.

Tập tin đầu vào của tôi là một cái gì đó như dưới đây.

-bash-3.2$ cat file
ramesh
ramesh_venkat
ramesh3_venkat3
ramesh4
ramesh5
venkat
venkat3
venkat4

Tôi đã sử dụng awklệnh để trích xuất các giá trị thứ hai sau _như dưới đây.

awk -F "_" '{print $2}' file

Tuy nhiên, mặc dù lệnh trên in các giá trị chính xác, tôi nhận được các dòng trống trong đầu ra của mình. Tôi có 2 câu hỏi.

Câu hỏi 1

Làm cách nào tôi có thể xóa các dòng trống trong đầu ra để tôi chỉ nhận venkatvenkat3trong đầu ra?

Nếu tôi sử dụng printfthay vì printtrong tôi awk, tôi nhận được venkatvenkat3như là đầu ra mà tôi không muốn đạt được. Tôi muốn đầu ra như,

venkat
venkat3

Câu hỏi 2

Sử dụng các giá trị đó như một mảng kết hợp hoặc một cái gì đó, làm thế nào tôi có thể tìm thấy nếu các giá trị thực sự xảy ra trong $1cột?

Tôi muốn đạt được một cái gì đó như,

awk -F "_" '$2==1{print $1}' file

BIÊN TẬP

Tôi không nhận thấy awkgiải pháp của Stephane. Có phải nó đang làm điều tương tự mà tôi đã đề cập?


1
Stephane awkkhông làm điều tương tự. Cách tiếp cận của bạn giả định rằng một từ chỉ có thể được chứa trong một từ khác nếu nó được phân tách bằng _. Mặc dù điều đó đúng với ví dụ của OP, tất cả các câu trả lời được đăng cũng xử lý các trường hợp như doglionvà không chỉ dog_lion.
terdon

Câu trả lời:


8

Câu hỏi 1

$ awk -F _ 'NF > 1 {print $2}' file
venkat
venkat3

Câu hỏi 2

$ awk -F _ '
    NR == FNR {a[$1];next}
    ($2 in a) {print $2}
' file file
venkat
venkat3

Tôi cần hiển thị venkatvenkat3theo OP hỏi trong câu hỏi khác. Tôi đang cố gắng tìm nếu khóa sau _có mặt trong $1cột của tôi .
Ramesh

Oh, tôi đã cập nhật câu trả lời của tôi!
cuonglm

Giải pháp tốt đẹp. Tôi nghĩ bạn cũng nên thêm cái này vào giải pháp của mình trong câu hỏi khác :)
Ramesh

8

cho Câu hỏi 1, bạn có thể sử dụng tùy chọn --only-delimited( -s) củacut

cut -s -f2 -d'_' file
venkat
venkat3

8

Cách tiếp cận khác:

Câu hỏi 1

awk -F_ '$2{print $2}' file

Điều này sẽ chỉ in nếu $2được xác định. Đó là một cách viết ngắn hơn:

awk -F_ '{if($2){print $2}}' file

Câu hỏi 2

Không có bất cứ điều gì để thêm mà chưa được giải quyết.


1
Giải pháp tốt cho câu hỏi1. Ngắn gọn và sắc nét :)
Ramesh

6

câu hỏi 1

awk -F "_" '/_/ {print $2}' file

Câu hỏi 2

awk -F "_" '{values[$1]=1;}; END {for (val in values) print val;}' file

Giải pháp tốt đẹp. Tôi thích nó :)
Ramesh

Đối với câu hỏi 2, tôi dự định chỉ lấy venkatvenkat3làm đầu ra khi chúng có mặt $1. Tuy nhiên, tôi nhận được tất cả các $1giá trị theo lệnh của bạn.
Ramesh

@Ramesh: Theo mô tả của bạn, tôi nghĩ rằng bạn muốn nhận được $2mục đã $2xảy ra trong cột 1. Thê nay đung không?
cuonglm

@Gnouc, vâng bạn đúng.
Ramesh
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.