2012-08-11 9 views

Trả lời

4

Divide & Conquer: làm điều đó trong hai bước:

  1. 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 ""}
  2. ố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.

6

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 
4

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 
3

Đâ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.