Thực hiện awk trên mỗi tệp được tìm thấy với find, sau đó chuyển hướng kết quả sang tên tệp mới


7

Tôi đang cố gắng lấy kết quả từ find và sau đó thực thi awk để in hai cột đầu tiên. Sau đó, tôi muốn chuyển hướng các kết quả đó sang một tên tệp mới cho mỗi tệp, sử dụng tên tệp hiện có với một hậu tố bổ sung được thêm vào tên. Các tệp trong thư mục có nguồn gốc còn lại là file.txt và các tệp mới được đặt tên là file-new.txt

Ví dụ:

find -type f -iname "*.txt" -exec awk '{print $1, $2}' {} \;

Tôi cần thêm gì để làm điều này? Sử dụng sed sẽ là một lựa chọn tốt hơn?

Câu trả lời:


8

Phương pháp đơn giản nhất là sử dụng chuyển hướng đầu ra của awk. Chuyển hướng đầu ra Awk rất dễ sử dụng trong các trường hợp đơn giản: tệp được mở lần đầu tiên khi sử dụng chuyển hướng và các chuyển hướng tiếp theo cho cùng tên tệp sử dụng bộ mô tả tệp hiện có.

Nếu bạn muốn thêm một hậu tố vào tên tệp, nó sẽ dễ dàng như

find -type f -iname "*.txt" -exec awk '{print $1, $2 >(FILENAME "-new")}' {} +

Nhưng bạn có thể thực hiện chuyển đổi phức tạp hơn trên tên tệp (ở đây chỉ được tính toán lại ở dòng đầu tiên của mỗi tệp đầu vào):

find -type f -iname "*.txt" -exec awk '
    FNR==1 {out=FILENAME; sub(/\.[^.]*$/, "-new&", out) || out = out "-new"}
    {print $1, $2 >out}
' {} +
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.