строки обработки текста столбцам для блока

У меня есть файл, содержащий списки на Solaris:

List A hi hello hw ru List B Hi Yes List C Hello 

Мне нужно транспонировать списки, как показано ниже:

 List A List B List C hi Hi Hello hello Yes hw ru 

Как я могу сделать это на Solaris?

Подход GNU awk :

 awk 'BEGIN{ max=0 } /^List/{ if(k && k>max) { max=k; idx=c } ++c; k=0 } NF{ a[c][++k]=$0 } END{ for(i=1;i<=max;i++) for(j=1;j<=c;j++) printf "%s%s",a[j][i],(j==c)?ORS:"\t" }' file | column -ts$'\t' 

Выход:

 List A List B List C hi Hi Hello hello Yes hw ru 

Вы можете использовать awk чтобы разделить каждый блок на отдельные файлы, а затем paste их вместе (ниже предполагается, что между списками всегда есть пустые строки).

 awk '/^$/ {N++;next}{print >"file"N}' infile.txt paste file* 

Также вы можете переместить команду paste в awk .

 awk '/^$/ {N++;next}{print >"file"N} END{system("paste file*")}' inile.txt 

Выход:

 List A List B List C hi Hi Hello hello Yes hw ru 

Помимо моего предыдущего ответа , есть также команда csplit чтобы разбить файл таким же образом, а затем использовать команду paste для получения желаемого результата.

 csplit -zs -f outfile in '/^List/' '{*}' paste outfile* 
  • '/^List/' – это шаблон для сопоставления и разбивки файла в следующий новый файл
  • '{*}' повторять шаблон как можно чаще
  • -z используется для удаления пустых выходных файлов; и -s используется, чтобы не печатать количество выходных файлов
  • -f используется для определения пользовательского префикса outfile ##, где ## по умолчанию 2 цифры, вы можете определить его с помощью -n N (N – количество цифр в суффиксе после определенного префикса)