csplit & colar
Use csplit
para dividir um arquivo em vários arquivos em um padrão. Em seguida, use paste
para unir os novos arquivos.
awk 'NF' column.txt | csplit --suppress-matched -s -z -f INTERIM -n 4 - '/start newset/' '{*}' ; paste INTERIM* | expand -t 6,13 ; rm -f INTERIM*
O mesmo código, reformatado para maior clareza:
awk 'NF' column.txt | \
csplit --suppress-matched -s -z -f INTERIM -n 4 - '/start newset/' '{*}' ;
paste INTERIM* | \
expand -t 6,13 ;
rm -f INTERIM*
Descrição:
-
awk 'NF' column.txt
Remover linhas vazias. Caso contrário, linhas vazias no arquivo de entrada colocariam separadores de colunas extras na saída.
- csplit
-
--suppress-matched
Não inclua linhas contendo o padrão de divisão na saída.
-
-s
Não mostra informações resumidas sobre os arquivos de saída.
-
-z
Não produz arquivos de saída vazios (isto é, quando duas linhas adjacentes do arquivo de entrada contêm o padrão de divisão).
-
-f INTERIM
Os nomes de arquivos dos arquivos divididos começam com esta string.
-
-n 4
Os nomes de arquivos dos arquivos divididos terminam com um número contendo muitos dígitos.
-
-
Recebe entrada de STDIN
, já que primeiro executamos o arquivo de entrada por meio de awk
.
-
'/start newset/'
Divida o arquivo de entrada na primeira linha que contenha esta expressão regular.
-
'{*}'
Continue dividindo o arquivo de entrada em cada linha adicional que contém essa expressão regular.
-
paste INTERIM*
Junte os arquivos temporários.
-
expand -t 6,13
Ajusta o espaçamento da coluna entre os arquivos unidos (por exemplo, inicia o segundo arquivo na coluna 6 e o terceiro arquivo na coluna 13).
-
rm -f INTERIM*
Exclua os arquivos temporários.
Exemplo de arquivo de entrada column.txt
:
1 1.1
2 4.0
3 3.2
start newset
1 2.2
2 6.1
3 10.3
4 2.1
start newset
1 18.2
2 4.3
Exemplo de saída:
1 1.1 1 2.2 1 18.2
2 4.0 2 6.1 2 4.3
3 3.2 3 10.3
4 2.1
É um pouco mais complicado se as linhas do arquivo de entrada e a saída final forem recuadas.
Exemplo de arquivo de entrada column.txt
:
1 1.1
2 4.0
3 3.2
start newset
1 2.2
2 6.1
3 10.3
4 2.1
start newset
1 18.2
2 4.3
- Altere
awk 'NF'
para awk 'NF { sub(/^ +/,"",$0) ; print $0 }'
para remover o recuo antes de continuar o processamento.
- Altere
expand -t 6,13
para awk '{ print " " $0 }' | expand -t 8,15
para recuar a saída.
Exemplo de saída:
1 1.1 1 2.2 1 18.2
2 4.0 2 6.1 2 4.3
3 3.2 3 10.3
4 2.1