2016-08-05 2 views
2

Я пытаюсь нарезать строку на несколько строк с помощью awk. После каждых двух слов.Вырезать строку в несколько строк с помощью awk

Вход:

hey there this is a test 

Выход:

hey there 
this is 
a test 

Я могу добиться этого с помощью xargs, следующим образом:

echo hey there this is a test |xargs -n2 
hey there 
this is 
a test 

Однако мне интересно знать, как для того чтобы достигнуть это использование awk. Вот команда, которую я использую, что, конечно же, не дало ожидаемого результата.

echo hey there this is a test | awk '{ for(i=1;i<=NF;i++) if(i%2=="0") ORS="\n" ;else ORS=" "}1' 
hey there this is a test 

И

echo hey there this is a test | awk '{$1=$1; for(i=1;i<=NF;i++) if(i%2==0) ORS="\n" ;else ORS=" "}{ print $0}' 
hey there this is a test 

Нужно знать, что концептуально неправильно в команде выше AWK и как он может быть изменен, чтобы дать правильный вывод. Предположим, что вход имеет одну линию.

Спасибо и с уважением.

ответ

3

Использование AWK вы можете сделать:

s='hey there this is a test' 
awk '{for (i=1; i<=NF; i++) printf "%s%s", $i, (i%2 ? OFS : ORS)}' <<< "$s" 

hey there 
this is 
a test 
+1

++ Отлично, это сработало. Понял, какую ошибку я делал. Благодарю. –

2

Сначала вы хотите, чтобы OFS (разделитель полей) не был ORS (разделитель записи). И ваш for в конце устанавливает одиночную ORS, она итерации по всем полям и устанавливает значение ORS взад и вперед между «" и "\ n", и в конце будет только одно значение.

Так что вы действительно хотите работать с записями (обычно это строки) вместо полей (обычно их разделяют пробелы).

Вот версия, которая использует записи:

echo hey there this is a test | awk 'BEGIN {RS=" "} {if ((NR-1)%2 == 0) { ORS=" "} else {ORS="\n"}}1' 

Результат:

hey there 
this is 
a test 
+0

Спасибо, работал. –

1

Другой аромат @ Krzyk-х версии:

$ awk 'BEGIN {RS=" "} {ORS="\n"} NR%2 {ORS=" "} 1' test.in 
hey there 
this is 
a test 

$ 

Может быть, даже:

awk 'BEGIN {RS=" "} {ORS=(ORS==RS?"\n":RS)} 1' test.in 

Они оба делают оставить уродливый войти в конце концов, хотя.

Смежные вопросы