2012-08-11 14 views

Odpowiedz

4

Divide & Conquer: zrobić to w dwóch etapach:

  1. stosować awk wprowadzić pusty wiersz
    oddzielić każdy rekord dwuwierszowy: NR%2==0 {print ""}
  2. rura do innego procesu awk i
    zestaw rekordów separator do pustej linii: BEGIN {RS=""}

Zaleta: w drugim awk proces masz dostępne wszystkie pola z dwóch linii jako $1 to $NF.

awk '{print}; NR%2==0 {print ""}' data | \ 
awk 'BEGIN {RS=""}; {$1=$1;print}' 

Uwaga:
$1=$1 używany jest tutaj, aby wymusić aktualizację $0 (cały rekord).
Gwarantuje to, że wydruk wypisze dwuwierszowy zapis w jednym wierszu.
Po zmodyfikowaniu pola w programie podczas przetwarzania rekordów dwuwierszowych nie jest to już wymagane.

6

Zależy od tego, co chcesz osiągnąć, ale jednym ze sposobów jest użycie instrukcji getline. Dla każdej linii przeczytaj następną i zapisz ją w zmiennej. Więc trzeba będzie pierwszą linią w $0 i drugi w even_line:

getline even_line 
4

Jeśli chcesz połączyć linie, użyj narzędzia paste:

$ 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

To trochę hackish, ale jest to dosłowny odpowiedź na pytanie:

awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile 

Ustaw separator rekordów na wyrażenie regularne odpowiadające dwóm wierszom. Następnie dla każdej linii ustaw $0 na zakończenie rekordu (co jest zgodne z wyrażeniem regularnym w RS). Spowoduje to podział pola na FS. Oświadczenie o druku jest tylko miejscem przechowywania prezentacji.

Pamiętaj, że $0 będzie zawierać dwa znaki nowej linii, ale pola nie będą zawierały żadnych znaków nowej linii.