перемещение каждой второй строки в новый столбец с awk

Вот еще один вопрос о нобе. У меня есть такой файл

John
30
Mike
0.0786268
Tyson
0.114889
Gabriel
0.176072
Fiona
0.101895

Мне нужно сдвинуть каждую вторую строку на новый столбец, чтобы она выглядела так:

John   30
Mike   0.0786268
Tyson  0.114889
Gabriel 0.176072
Fiona   0.101895

Я просто сейчас, когда awk 'NR% 2 == 0' будет печатать каждую вторую строку, может кто-нибудь предложить мне, как перенести их в новый столбец, как указано выше. Любая помощь очень ценится.

5
добавлено
Просмотры: 1
de
Связанный, но не awk специфический: stackoverflow.com/questions/8522851/…
добавлено автор Michael J. Barber, источник

7 ответы

awk '{printf "%s%s",$0,(NR%2?FS:RS)}' file

Объяснение:

  • printf will not include a new line character at the end of line (unlike print)
  • (NR%2?FS:RS) decides new line (RS) or field seperator (FS) based on NR%2

If your colmns should be seperated by \t

awk '{printf "%s%s",$0,NR%2?"\t":RS}'
7
добавлено
Это решение опирается на значения по умолчанию FS и RS, которые являются соответственно пространством и новой линией.
добавлено автор Tom, источник
+1 Это блестяще.
добавлено автор jaypal singh, источник
Это превосходная и элегантная иллюстрация AWK. Никакое другое решение не приближается.
добавлено автор Greg A. Woods, источник
Это помогло мне. Спасибо @ ed-Morton
добавлено автор Hsehdar, источник

xargs может это сделать, командная строка действительно короткая:

xargs -n2 < file
3
добавлено

Один из способов:

awk '{ printf("%-10s ",$0); if(NR%2==0) printf("\n");}' file

Посмотрите

1
добавлено
printf является встроенным, а не функцией, поэтому() не делают то, что, по вашему мнению, они делают, конечная полуточка является сверхплотной, а способ печати новой строки - print "" .
добавлено автор Ed Morton, источник
printf печатает без новой строки, а % s - спецификация формата для строки. % - 10s будет заполнять пробелы длиной до 10, выравнивать по левому краю или обрезать более длинную строку. Я бы на самом деле printf ("% s", $ 0) вместо пробела после% s, альтернативно символ табуляции, \ t .
добавлено автор tripleee, источник
Спасибо за один лайнер, он работает отлично. Я только начал изучать awk, и если бы я мог задать вам немного больше, я думаю, printf («% - 10s», $ 0) будет печатать каждую вещь в строке, но после этого я не мог понять. Еще раз спасибо.
добавлено автор Amit, источник

У меня возникнет соблазн использовать sed следующим образом:

sed 'N;s/\n/ /' file

Однако это не будет хорошо форматировать ваши данные. Вы можете передать его в столбец -t :

< file sed 'N;s/\n/ /' | column -t

Но это кажется ненужным. Было бы лучше использовать paste следующим образом:

paste - - < file

Результаты:

John    30
Mike    0.0786268
Tyson   0.114889
Gabriel 0.176072
Fiona   0.101895
1
добавлено
Спасибо, не знал, что это можно сделать с помощью пасты
добавлено автор Amit, источник

sed лучше сделать это, чем awk:

sed 'N;s/\n/ /g' yourfile

также в awk:

awk '{if(NR%2!=0){p=""}else{p="\n"};printf $0" "p}' your_file

also check another solution here

0
добавлено
sed не лучше делать это, чем awk, поскольку это НЕ даже близко к тому, как вы это сделаете в awk.
добавлено автор Ed Morton, источник
спасибо, вы работаете как шарм
добавлено автор Amit, источник
paste - - < file > newfile

По умолчанию вкладка используется как разделитель.

0
добавлено
awk 'NR%2{s=$0; next} {print s, $0}' file

or using default action

awk 'NR%2{s=$0; next} {$0=s" "$0}1' file
0
добавлено