2013-02-20 27 views
45

Nhiều người đã rất hữu ích bằng cách đăng các giải pháp sau đây để AWK'ing nhiều file đầu vào cùng một lúc:Sử dụng AWK để xử lý đầu vào từ nhiều tập tin

$ awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 

này hoạt động tốt, nhưng tôi đã tự hỏi nếu tôi có người có thể giải thích cho tôi tại sao? Tôi tìm thấy cú pháp AWK một chút khó khăn để có được hang của và đã hy vọng ai đó sẽ không nhớ phá vỡ đoạn mã xuống cho tôi.

Trả lời

50
awk 'FNR==NR{a[$1]=$2 FS $3;next} 

tại đây chúng tôi xử lý đầu vào thứ nhất (tệp2). nói, FS là không gian, chúng tôi xây dựng một mảng (a) lên, chỉ mục là cột1, giá trị là column2 " " column3 các FNR==NR and next có nghĩa là, phần mã này chỉ hoạt động đối với tệp2. bạn có thể người đàn ông gawk kiểm tra những gì là NR và FNR

{ print $0, a[$1]}' file2 file1 

Khi NR != FNR đó là thời gian để xử lý đầu vào thứ 2, file1. ở đây chúng ta in dòng của file1, và lấy column1 làm chỉ số, tìm ra giá trị trong mảng (a) print. trong một từ khác, tệp 1 và tệp2 được nối bởi cột1 trong cả hai tệp.

cho NR và FNR, ngay,

1st input has 5 lines 
2nd input has 10 lines, 

NR would be 1,2,3...15 
FNR would be 1...5 then 1...10 

bạn thấy trick của FNR==NR séc.

+0

Kent, giải thích tuyệt vời; Cảm ơn nhiều. Tôi đã không nhận ra rằng 'FNR == NR' đã hình thành một loại câu lệnh 'if'. Đây chính xác là những gì tôi cần để có thể tiến lên phía trước. Cảm ơn rất nhiều vì đã dành thời gian giúp đỡ! – jkovba

8

Tôi đã tìm thấy câu hỏi/câu trả lời này trên Google và dường như đề cập đến một tập dữ liệu rất cụ thể được tìm thấy trong một câu hỏi khác (How to merge two files using AWK?). Sau đây là câu trả lời tôi đang tìm kiếm (và tôi nghĩ hầu hết mọi người sẽ là), tức là, chỉ cần ghép nối mọi dòng từ hai tệp khác nhau bằng AWK. Mặc dù bạn có thể có thể sử dụng một số tiện ích UNIX như tham gia hoặc dán, AWK rõ ràng là nhiều hơn nữa linh hoạt và mạnh mẽ nếu đầu ra mong muốn của bạn là khác nhau, bằng cách sử dụng nếu báo cáo, hoặc thay đổi OFS (có thể hơn khó khăn để làm tùy thuộc vào tiện ích, xem dưới đây) ví dụ, thay đổi đầu ra một cách nhiều biểu cảm hơn (một yếu tố quan trọng đối với scripters vỏ)

đối với đơn giản line-by-line nối:

awk 'FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }' file1 file2.

Điều này mô phỏng chức năng của một mảng được lập chỉ mục bằng số (AWK chỉ có mảng kết hợp) bằng cách sử dụng chuyển đổi loại ngầm định. Nó tương đối biểu cảm và dễ hiểu.

Sử dụng hai tập tin gọi là test1 và test2 với những dòng sau:

test1:

line one 
line two 
line three 

test2:

line four 
line five 
line six 

tôi nhận được kết quả này:

line one line four 
line two line five 
line three line six 

Tùy thuộc vào ho w bạn muốn tham gia các giá trị giữa các cột trong đầu ra, bạn có thể chọn dấu phân cách trường đầu ra thích hợp. Dưới đây là ví dụ với dấu ba chấm (...) Tách các cột:

awk 'BEGIN { OFS="..."} FNR==NR { a[(FNR"")] = $0; next } { print a[(FNR"")], $0 }' test1 test2

yielding kết quả này:

line one...line four 
line two...line five 
line three...line six 

Tôi hy vọng ít nhất rằng đây truyền cảm hứng cho tất cả các bạn để tận dụng sức mạnh của AWK!

+4

Nếu mục tiêu chỉ là tham gia các cột cạnh nhau, thì việc sử dụng lệnh 'paste' là rất đơn giản. – biocyberman

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