2011-10-21 12 views

Trả lời

22

thử:

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

Output:

111 000 444 
222 111 555 
333 555 666 

Giải thích về đoạn code trên:

  • FNR==NR tất cả ows bạn làm việc với một tập tin toàn bộ tại một thời điểm. Trong trường hợp này, nó là tập tin f2. NRFNR cả hai đều chứa số dòng với sự khác biệt là FNR được đặt lại thành 1 khi tệp mới được đọc ở đâu khi NR tiếp tục tăng.
  • Trong khi chúng tôi đang làm việc với f2 tệp, chúng tôi đang tạo một mảng gọi là a sử dụng số dòng (NR) làm key và cột thứ ba ($3) làm giá trị. next cho phép chúng tôi bỏ qua phần còn lại của khối hành động.
  • Sau khi f2 tệp kết thúc, chúng tôi bắt đầu làm việc trên f1 tệp. Điều kiện NR==FNR sẽ không trở thành sai vì FNR sẽ tăng từ 1 và NR sẽ không. Vì vậy, chỉ khối tác vụ thứ hai {$2=a[FNR]} sẽ được thực hiện.
  • Khối này sẽ gán lại giá trị cột thứ hai cho giá trị mảng bằng cách tra cứu số dòng.
  • 1 ở cuối in dòng. Nó trả về true, và trong awk câu lệnh đúng dẫn đến việc in dòng.
  • f2 f1 là thứ tự các tệp được xác định. Vì chúng tôi muốn tạo một mảng từ tệp f2, chúng tôi đặt nó trước tiên.
+1

Bạn có thể giải thích lệnh này không. Cảm ơn – saloua

+0

@saloua Tôi đã thêm một số giải thích. Hy vọng rằng sẽ giúp! –

+1

Trường hợp sử dụng của tôi hơi khác một chút (chỉ hơi). Sự khác biệt là tôi đã có một tệp phân cách bằng dấu phẩy cho f1 và f2 thay vì dấu phân cách bằng dấu cách. Tôi đã thử lệnh tương tự của bạn với tùy chọn '-F,' nhưng tệp đầu ra không có dấu phẩy trong trường hợp đó. Có cách nào để sửa lỗi này không? – Ganesh