Tôi có một tập tin văn bản chứa đầy một loạt dữ liệu. Tôi cần phải rút ra các dòng có chứa các chuỗi cụ thể. Tôi đã thực hiện điều này với awk bằng cách sử dụng như sau:
awk '/pattern1|pattern2|pattern3/ {print;}' infile
Sau đó tôi cần đặt một dòng mới (\ n) sau dòng thứ 3. Vì vậy, nó sẽ cần phải trông như thế này
pattern1
pattern2
pattern3
<new line>
pattern1...
Tôi đã có thể thực hiện điều này bằng cách chuyển lệnh đầu tiên sang một câu lệnh awk khác
awk -F '\n' '/pattern1|pattern2|pattern3/ { print; }' infile | awk '{ if ((NR % 3) == 1) printf("\n"); print; }'
Tôi nghĩ rằng phải có một cách hiệu quả hơn để làm điều này vì vậy tôi bắt đầu tìm cách xem làm thế nào tôi có thể kết hợp hai lệnh lại với nhau. Tôi đã thử như sau:
awk '/pattern1|pattern2|pattern3/ { if ((NR % 3) ==1 ) printf("\n"); print; }'
Tôi hình dung điều này sẽ hoạt động nhưng đầu ra hoàn toàn không thể đoán trước, đôi khi có 5 dòng được nhóm lại với nhau, nhóm 2 dòng, nhưng không có dòng 3.
Tôi đã nghĩ rằng có lẽ có vấn đề về dấu phân cách nên tôi đã thử chơi với tùy chọn -F và đặt IFS nhưng không thay đổi đầu ra.
Tôi nghĩ rằng tôi đang làm điều gì đó ngu ngốc theo cách tôi đã cố gắng kết hợp khớp mẫu với câu lệnh if nhưng tôi không thể tìm ra sự kết hợp.
Là những gì tôi đang cố gắng để làm có thể trong một lệnh awk duy nhất? Và nếu vậy, tôi sẽ đi sai ở đâu?