2014-11-10 12 views
36

Tôi gặp sự cố ở đây. Tôi phải in một cột trong một tập tin văn bản bằng cách sử dụng awk. Tuy nhiên, các cột không được phân tách bằng dấu cách, chỉ sử dụng một dấu phẩy. Có dạng như sau:Cột in dòng lệnh AWK được phân tách bằng dấu phẩy

column1,column2,column3,column4,column5,column6 

Tôi làm cách nào để in cột thứ 3 bằng awk?

Cảm ơn bạn đã trợ giúp.

+0

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ỳ ý định nào để giải quyết nó không? – TrueY

Trả lời

56

Hãy thử:

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

đây trong -F bạn đang nói đến awk rằng việc sử dụng "" như tách lĩnh vực.

+0

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

9

Hãy thử điều này awk

awk -F, '{$0=$3}1' file 
column3 
  • , lĩnh vực Divide bởi ,
  • $0=$3 Đặt dòng để trường chỉ 3
  • 1 In tất cả ra ngoài. (explained here)
+4

Cũng như ngắn hơn, điều này khó khăn hơn đối với một người không quen với việc hiểu. Nó sẽ có giá trị thêm một số lời giải thích để làm cho câu trả lời này hữu ích hơn. –

+1

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

+1

@TomFenech: Tôi nghĩ rằng 'cut -d, -f3 file' là khó hiểu như thế này nếu ai đó không quen với' cut'. ;) – TrueY

3

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

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

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

EDIT từ Ed Morton (xin lỗi vì hi-Jacking câu trả lời, tôi không biết nếu có một cách tốt hơn để giải quyết vấn đề này):

Để đặt để nghỉ ngơi huyền thoại mà shell sẽ chạy nhanh hơn awk cho file 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 file đủ thực sự nhỏ sau đó bạn sẽ thấy những shell script chạy trong một phần nhỏ của một chớp mắt nhanh hơn so với kịch bản awk nhưng ai quan tâm?

Và nếu bạn không tin rằng đó là khó khăn hơn để viết kịch bản shell mạnh mẽ hơn awk kịch bản, nhìn vào lỗi này trong kịch bản shell bạn được đă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

' Trong khi các vòng read' là chậm hơn 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 thể bỏ qua. –

+0

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

+0

Tôi nghi ngờ nếu nó chạy nhanh hơn awk cho các tập tin nhỏ và tùy thuộc vào tốc độ nào thì sẽ không đáng kể. , '{print $ 3}' tệp '? Tránh gọi các công cụ "bên ngoài" không phải là mục tiêu của việc lập trình shell - toàn bộ lý do vỏ tồn tại là việc dán các chuỗi cuộc gọi đến các công cụ "bên ngoài". –

25

Nếu yêu cầu duy nhất của bạn là in thứ ba lĩnh vực mỗi dòng, mỗi lĩnh vực giới hạn bởi một dấu phẩy, bạn có thể sử dụng cắt:

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

+1 cho câu trả lời đúng. –

+1

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

Các vấn đề liên quan