processar linhas de texto em colunas para um bloco

2

Eu tenho um arquivo contendo listas no Solaris:

List A
hi
hello
hw r u

List B
Hi
Yes

List C
Hello

Eu preciso transpor as listas conforme mostrado abaixo:

List A    List B    List C
hi        Hi        Hello
hello     Yes
hw r u

Como posso fazer isso no Solaris?

    
por John 07.09.2017 / 12:44

3 respostas

-1

Abordagem do 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'

A saída:

List A  List B  List C
hi      Hi      Hello
hello   Yes
hw r u
    
por 07.09.2017 / 14:37
3

Você pode usar awk para dividir cada bloco em arquivos separados e, em seguida, paste juntos (abaixo está assumindo sempre que há linhas vazias entre cada lista).

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

Você também pode mover o comando paste para awk .

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

A saída é:

List A    List B    List C
hi        Hi        Hello
hello     Yes
hw r u

para ter recuo de beleza no resultado ao variar o comprimento das linhas, como abaixo:

Arquivo de entrada:

list A
hi
hello
hw r u

List B
Hi this is list B
Yes

List C
Hello, this is list C

você pode fazer paste file* |column -s $'\t' -tn e terá resultado:

list A  List B             List C
hi      Hi this is list B  Hello, this is list C
hello   Yes
hw r u
    
por 07.09.2017 / 14:16
0

Além da minha resposta anterior , há também o comando csplit para dividir o arquivo da mesma maneira e use o comando paste para obter a saída desejada.

csplit -zs -f outputfile inputfile '/^List/' '{*}'
paste outfile*
  • '/^List/' é um padrão para combinar e dividir o arquivo no próximo novo arquivo
  • '{*}' repetir o padrão quantas vezes for possível
  • -z é usado para remover arquivos de saída vazios; e -s é usado para não imprimir contagens de tamanhos de arquivo de saída
  • -f é usado para definir o prefixo personalizado arquivo_de_saída ## onde ## é por padrão 2 dígitos, você pode defini-lo com -n N (N é o número de dígitos no sufixo após o prefixo definido)
por 07.09.2017 / 20:02