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
. NR
và FNR
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.
Bạn có thể giải thích lệnh này không. Cảm ơn – saloua
@saloua Tôi đã thêm một số giải thích. Hy vọng rằng sẽ giúp! –
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