Cột in được phân tách bằng dấu phẩy bằng dòng lệnh Awk


84

Tôi gặp vấn đề ở chỗ này. Tôi phải in một cột trong tệp văn bản bằng awk. Tuy nhiên, các cột hoàn toàn không được phân tách bằng dấu cách, chỉ sử dụng một dấu phẩy duy nhất. Trông giống như sau:

column1,column2,column3,column4,column5,column6

Làm cách nào để in ra cột thứ 3 bằng awk?


1
Tại sao bạn muốn sử dụng awk? IMHO đây là một vấn đề rất đơn giản. Bạn có bất kỳ tham dự để giải quyết nó?
TrueY

Câu trả lời:


126

Thử:

awk -F',' '{print $3}' myfile.txt

Ở đây trong -F bạn đang nói với awk sử dụng "," làm dấu phân tách trường.


Tôi đã duyệt qua rất nhiều trang và nhận được nhiều kết quả hơn và đây là kết quả tốt nhất cho đến nay :) Cảm ơn bạn
AJC

41

Nếu yêu cầu duy nhất của bạn là in trường thứ ba của mỗi dòng, với mỗi trường được phân tách bằng dấu phẩy, bạn có thể sử dụng cut:

cut -d, -f3 file
  • -d, đặt dấu phân cách thành dấu phẩy
  • -f3 chỉ định rằng chỉ trường thứ ba được in

1
Đây là câu trả lời tốt nhất cho câu hỏi này. awkcó rất tiện dụng khi cho phép nói rằng tôi muốn in [col1]:[col5]với dels khác nhau và một định dạng khác nhau
Arijoon

28

Thử cái này awk

awk -F, '{$0=$3}1' file
column3
  • , Chia các trường cho ,
  • $0=$3 Đặt dòng thành trường chỉ 3
  • 1In tất cả ra. ( giải thích ở đây )

Điều này cũng có thể được sử dụng:

awk -F, '{print $3}' file

4
Cũng vì ngắn hơn, điều này khó hiểu hơn đối với những người không quen thuộc với awk. Sẽ là giá trị thêm một số giải thích để làm cho câu trả lời này hữu ích hơn.
Tom Fenech

1
+1. Một chút khó hiểu, nhưng hoạt động giống như một Schaffhausen.
TrueY

1
@TomFenech: Tôi nghĩ cut -d, -f3 filecũng khó hiểu như cái này nếu ai đó không quen cut. ;)
TrueY

3
@TrueY được cấp, mặc dù có một điểm khác biệt là nó cut --helpsẽ giải thích mọi thứ bạn cần biết, trong khi awk --helpthì không. Có lẽ tôi nên đã đi cho cut --delimiter=, --fields=3 file, mặc dù tôi đã nghi ngờ của tôi rằng công tắc còn là :) cầm tay
Tom Fenech

2

Một đơn giản, mặc dù -less giải pháp trong :

while IFS=, read -r a a a b; do echo "$a"; done <inputfile

Nó hoạt động nhanh hơn đối với các tệp nhỏ (<100 dòng) sau đó vì nó sử dụng ít tài nguyên hơn (tránh gọi các cuộc gọi hệ thống forkvà đắt tiền execve).

CHỈNH SỬA từ Ed Morton (xin lỗi vì đã đánh cắp câu trả lời, tôi không biết có cách nào tốt hơn để giải quyết vấn đề này không):

Để giải quyết huyền thoại rằng shell sẽ chạy nhanh hơn awk cho các tệp nhỏ:

$ wc -l file
99 file

$ time while IFS=, read -r a a a b; do echo "$a"; done <file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

$ time awk -F, '{print $3}' file >/dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.015s

Tôi hy vọng nếu bạn nhận được một tệp REALY đủ nhỏ thì bạn sẽ thấy tập lệnh shell chạy nhanh hơn tập lệnh awk trong một tích tắc nhưng ai quan tâm?

Và nếu bạn không tin rằng khó viết các tập lệnh shell mạnh mẽ hơn các script awk, hãy xem lỗi này trong tập lệnh shell mà bạn đã đăng:

$ cat file
a,b,-e,d
$ cut -d, -f3 file
-e
$ awk -F, '{print $3}' file
-e
$ while IFS=, read -r a a a b; do echo "$a"; done <file

$

1
While readCác vòng lặp chậm hơn đặc biệt so với awk, ngay cả khi nó nhanh hơn với các tệp nhỏ, sự khác biệt về tốc độ sẽ không đáng kể.

@Jidder: Bạn nói đúng! IMHO đó là lý do tại sao sử dụng awk cho các tệp nhỏ là vô nghĩa .
TrueY

1
@EdMorton: Bạn nói đúng. Đối với các vấn đề lớn hơn và phức tạp hơn, tôi chắc chắn sử dụng awk (thường được gọi từ tập lệnh bash ), nhưng đối với các tệp nhỏ và các tác vụ đơn giản, tôi sử dụng bash thuần túy . Mặt khác, đối với những công việc phức tạp hơn, tôi thích perl hơn cho việc viết kịch bản.
TrueY

1
@EdMorton: Một lần nữa bạn lại đúng và có vẻ như echonó không thể được giải quyết dễ dàng. Trong trường hợp đó, người ta có thể sử dụng printf "%s\n" "$a"để loại bỏ điều đó. Đây cũng là một tích hợp bash .
TrueY

1
@EdMorton: Bạn nói đúng! Nếu ai đó sử dụng bất kỳ công cụ nào thì người đó cần biết các vấn đề có thể xảy ra. Vì vậy, tôi đề nghị bất cứ ai sử dụng một công cụ thích hợp. Nếu tôi viết một mô-đun hạt nhân, tôi chắc chắn trình bao không sử dụng bash . ;) Nhưng đối với một nhiệm vụ khó khăn như vậy, nó có thể là đủ.
TrueY
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.