Транспонировать строки в столбец в unix

У меня есть входной файл, который приведен ниже

Входной файл

10,9:11/61432568509
118,1:/20130810014023
46,440:4/GTEL
10,9:11/61432568509
118,1:/20130810014023
46,440:4/GTEL

Выход, который я ищу.

10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL

Я пробовал с командой awk, но не получаю желаемого результата. может ли кто-нибудь помочь мне в этом?

awk -F"" '{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}' inputfile

person gyrous    schedule 25.09.2013    source источник


Ответы (6)


Использование awk:

$ awk 'ORS=(NR%3==0)?"\n":","' inputfile
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL

РЕДАКТИРОВАТЬ: Как прокомментировали sudo_O и Эд Мортон, следующий вариант более портативный:

$ awk 'ORS=(NR%3?",":RS)' inputfile
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
person devnull    schedule 25.09.2013
comment
+1 Однако вы должны использовать круглые скобки с тернарным оператором, чтобы избежать двусмысленности (не получится на Mac). Я бы написал это awk 'ORS=(NR%3?",":RS)' file - person Chris Seymour; 25.09.2013
comment
Может кто-нибудь изменить свой ответ на awk 'ORS=(NR%3?",":RS)' file, чтобы я мог проголосовать за него :-). - person Ed Morton; 25.09.2013
comment
@EdMorton, ты знаешь, что у тебя есть права на редактирование, верно? stackoverflow.com/help/editing - person Chris Seymour; 25.09.2013
comment
@EdMorton И ваше редактирование тоже не нужно проверять :) - person devnull; 25.09.2013
comment
@sudo_O и devnull - да, я просто ненавижу менять содержание чужого поста, кроме форматирования, если оно плохое. Это все равно, что расчесывать волосы чужим детям... Голосование готово! - person Ed Morton; 25.09.2013

С pr:

$ pr -ats, file --columns 3  
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL

С args и tr:

$ xargs -n3 < file | tr ' ' ,
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
person Chris Seymour    schedule 25.09.2013

Вот как это сделать с paste:

paste -d, - - - < file

Выход:

10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
person Thor    schedule 25.09.2013
comment
Можем ли мы перебрать все -, чтобы преобразовать столбец в строку? - person Amir; 18.01.2015
comment
@Amir: конечно, но более разумно использовать tr, например. tr '\n' ',' < file. - person Thor; 18.01.2015

если каждый из ваших «блоков данных» имеет 3 строки, вы можете сделать:

sed -n 'N;N;s/\n/,/g;p' file

если вы любите awk:

awk 'NR%3{printf "%s,",$0;next}7' file
person Kent    schedule 25.09.2013
comment
Приятно видеть три разных варианта! Обратите внимание, что OP хочет, чтобы между соединенными строками была запятая ,. - person fedorqui 'SO stop harming'; 25.09.2013
comment
@fedorqui о ... Я не проверял 3 строки ... :( Я собираюсь исправить это запятой .. спасибо за указание. - person Kent; 25.09.2013

Короткая awk версия

awk 'ORS=NR%3?",":RS' file

Сокращено, спасибо iiSaymour

person Jotne    schedule 25.09.2013
comment
Shorted по-прежнему awk 'ORS=NR%3?",":RS' file, но, как я уже сказал в ответах @devnull, вам действительно следует использовать круглые скобки вокруг тернарного оператора для переносимости на все awks. - person Chris Seymour; 25.09.2013

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

$ awk -v RS= -F'\n' 'BEGIN{OFS=","}{for (i=1;i<=NF; i=i+3) {print $i,$(i+1),$(i+2)}}' file
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL

Он определяет каждое поле как строку. Следовательно, он печатает их блоками по три.

person fedorqui 'SO stop harming'    schedule 25.09.2013