Tôi tự hỏi cách sử dụng Awk để xử lý mỗi 2 dòng dữ liệu thay vì mỗi dòng. Theo mặc định, bộ tách bản ghi (RS) được đặt thành mọi dòng mới, làm thế nào tôi có thể thay đổi điều này thành 2 dòng.awk để thay đổi bộ tách bản ghi (RS) thành 2 dòng
Trả lời
Divide & Conquer: làm điều đó trong hai bước:
- sử dụng awk để giới thiệu dòng trống
để tách mỗi bản ghi hai dòng:NR%2==0 {print ""}
- ống đến một quá trình awk và
kỷ lục bộ dấu phân tách thành dòng trống:BEGIN {RS=""}
Lợi thế: Trongthứ hai Quy trìnhbạn có tất cả các trường của hai dòng có thể truy cập là $1 to $NF
.
awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'
Lưu ý:
$1=$1
được sử dụng ở đây để thi hành một bản cập nhật trên $0
(toàn bộ bản ghi).
Điều này đảm bảo rằng đầu ra in bản ghi hai dòng trên một dòng.
Sau khi bạn sửa đổi một trường trong chương trình của mình khi bạn xử lý bản ghi hai dòng, điều này không còn cần thiết nữa.
Tùy thuộc vào những gì bạn muốn đạt được, nhưng một cách là sử dụng hướng dẫn getline
. Đối với mỗi dòng, đọc tiếp theo và lưu nó vào một biến. Vì vậy, bạn sẽ có dòng đầu tiên trong $0
và thứ hai trong even_line
:
getline even_line
Nếu bạn muốn kết hợp đường nét, sử dụng paste
tiện ích:
$ printf "%s\n" one two three four five
one
two
three
four
five
$ printf "%s\n" one two three four five | paste -d " " - -
one two
three four
five
Đây là một chút hackish, nhưng đó là một literal trả lời cho câu hỏi của bạn:
awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
Đặt dấu phân tách bản ghi thành regex phù hợp với hai dòng. Sau đó, cho mỗi dòng, đặt $0
cho trình kết thúc bản ghi (đó là những gì khớp với regex trong RS
). Điều này thực hiện phân tách trường trên FS
. Bản in chỉ là một người giữ chỗ trình diễn.
Lưu ý rằng $0
sẽ chứa hai dòng mới, nhưng các trường sẽ không chứa bất kỳ dòng mới nào.