Arquivo Split e Format no Linux em uma única linha

1

Por favor me ajude a encontrar uma solução para a questão abaixo. Eu estou tentando escrever um comando SINGLE LINE no Linux que me dá a saída (imagem anexada) do arquivo Example.txt abaixo -

Entrada - Example.txt

11430.00    SH: gry to dk gry, firm to mod hd, plty, flk, ea to gt, abd LCM; SLTST: gry, sft to firm, amor to blky, slty to ea
11460.00    SH: gry to dk gry, firm to mod hd, plty, flk, ea to gt, abd LCM; SLTST: gry, sft to firm, amor to blky, slty to ea
11490.00    MRL: lt gry, mod hd, blky, occ flk, wxy; SH: gry to dk gry, firm to mod hd, plty, occ blky, ea to gt; SLTST: gry to dk gry, mod firm to firm, amor, blky, slty
11520.00    SH: gry to dk gry, firm to mod hd, plty, blky, ea to gt, tr MRL, occ LCM; SLTST: gry, occ brnsh rd, firm, amor to blky, ea to g

Eu usei fmt -w 50 -u Example.txt > FMT_Output.txt , mas não gera uma saída desejada. Preciso de espaços / guias em todas as linhas, exceto as que começam com números, como mostrado em Saída desejada. Eu também tentei usar o comando sed 's/^/ / , mas é um processo de várias etapas e esse comando também não fornece a saída desejada. Você pode por favor me avisar se há uma maneira de fazer isso em um único processo de passo?

Infelizmente, não está funcionando quando tento carregar o arquivo formatado. Quando eu carregar o arquivo, o sistema deve perceber o número como coluna 1 e o texto como coluna 2. Mas toda a primeira linha formatada está entrando na primeira coluna e o texto restante na segunda coluna. Você pode, por favor, pensar em uma maneira de formatar com base nos cabeçalhos das colunas? Por favor, veja a nova foto.

DEEP    Description
(ft)    -
12370.0 LS: Mdst, blsh gry, sft, occ mod firm, crpxln, prly, arg, SLTST: blk, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m gry, sft, amor, wxy
12400.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, CLST: lt gry-m gry, occ rdsh gry, mod firm, amor, wxy, tr CHK
12430.0 LS: Mdst, blsh gry, mod firm, crpxln, chky, arg, SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SH: blk-dk gry, mod firm, blky-plty, occ brit, wxy
12460.0 SH: blk-dk gry, mod firm, blky-plty, occ brit, ea, SLTST: blk-dk gry, firm-mod hd, amor, gt, mod calc, SST: gry-dk gry, wl consol, v f, ang, p srt, cotd, slily calc cmt, no fluor
    
por NewCoder 25.08.2017 / 19:59

1 resposta

4

O formatador de texto par (e o GNU sed ) (veja o final para não- par solution):

$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | par 50p8h | sed -r -e '/^$/d' -e 's/^ {8}/\t/'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
        flk, ea to gt, abd LCM; SLTST: gry, sft to
        firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
        flk, ea to gt, abd LCM; SLTST: gry, sft to
        firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
        SH: gry to dk gry, firm to mod hd, plty,
        occ blky, ea to gt; SLTST: gry to dk gry,
        mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
        blky, ea to gt, tr MRL, occ LCM; SLTST:
        gry, occ brnsh rd, firm, amor to blky, ea
        to g
  1. tr -s ' ' compacta vários espaços sucessivos em um.
  2. O código awk apenas adiciona uma nova linha extra a cada linha de entrada.
  3. par 50p8h formata o texto resultante para uma largura de 50 caracteres com 8 caracteres de recuo deslocado.
  4. As expressões sed excluem linhas vazias e substituem execuções de 8 espaços no início de uma linha com um único caractere de tabulação.

Para uma solução que não use o GNU sed , você deve inserir um caractere de tabulação literal no lugar de \t na última expressão sed .

Para uma solução que usa espaços para o recuo e que alinha o recuo à esquerda, exatamente como na captura de tela (9 espaços):

$ tr -s ' ' <file | awk '{ print $0, "\n" }' | par 50p9h | sed -e '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
         SH: gry to dk gry, firm to mod hd, plty,
         occ blky, ea to gt; SLTST: gry to dk gry,
         mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
         blky, ea to gt, tr MRL, occ LCM; SLTST:
         gry, occ brnsh rd, firm, amor to blky, ea
         to g

Adicionar j a 50p9h justificará os parágrafos bem:

11430.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk, ea  to gt, abd LCM;  SLTST: gry, sft
         to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk, ea  to gt, abd LCM;  SLTST: gry, sft
         to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod  hd, blky, occ flk, wxy;
         SH: gry to dk gry,  firm to mod hd, plty,
         occ blky, ea to gt; SLTST: gry to dk gry,
         mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry,  firm to mod hd, plty,
         blky, ea  to gt, tr MRL,  occ LCM; SLTST:
         gry, occ brnsh rd, firm, amor to blky, ea
         to g

... e adicionando l a isso também forçará a última linha de cada parágrafo (não tão legal):

11430.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk,  ea  to  gt, abd  LCM;  SLTST:  gry,
         sft  to firm,  amor to  blky, slty  to ea
11460.00 SH: gry to dk gry,  firm to mod hd, plty,
         flk,  ea  to  gt, abd  LCM;  SLTST:  gry,
         sft  to firm,  amor to  blky, slty  to ea
11490.00 MRL: lt gry, mod  hd, blky, occ flk, wxy;
         SH: gry to dk gry,  firm to mod hd, plty,
         occ  blky, ea  to  gt; SLTST:  gry to  dk
         gry, mod  firm to firm, amor,  blky, slty
11520.00 SH:   gry  to   dk  gry,   firm  to   mod
         hd,  plty,  blky,  ea   to  gt,  tr  MRL,
         occ   LCM;   SLTST:    gry,   occ   brnsh
         rd,  firm,   amor  to   blky,  ea   to  g

par está disponível na maioria dos gerenciadores de pacotes na maioria dos Unices, mas você também pode encontrar suas fontes (para se compilar) no link

Solução usando fmt em vez de par

$ tr -s ' ' <file.in | awk '{ print $0, "\n" }' | fmt -w 50 |
  awk '/^[^0-9]/  { $0 = "         " $0 }
                  { print }' | fmt -w 50 | sed '/^$/d'
11430.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11460.00 SH: gry to dk gry, firm to mod hd, plty,
         flk, ea to gt, abd LCM; SLTST: gry, sft
         to firm, amor to blky, slty to ea
11490.00 MRL: lt gry, mod hd, blky, occ flk, wxy;
         SH: gry to dk gry, firm to mod hd, plty,
         occ blky, ea to gt; SLTST: gry to dk gry,
         mod firm to firm, amor, blky, slty
11520.00 SH: gry to dk gry, firm to mod hd, plty,
         blky, ea to gt, tr MRL, occ LCM; SLTST:
         gry, occ brnsh rd, firm, amor to blky, ea
         to g

fmt não é tão flexível em sua formatação e aqui precisamos usá-lo duas vezes para obter o resultado pretendido. Também usamos o fato de que cada linha original começa com um dígito.

  1. tr -s ' ' , como antes.
  2. awk '{ print $0, "\n" }' , como antes.
  3. A primeira fmt call ( fmt -w 50 ) está lá para obter a primeira linha de cada parágrafo na largura correta (50 caracteres).
  4. O script awk recuará cada linha que não começar com um dígito por 9 espaços.
  5. A segunda chamada fmt formatará todo o texto para 50 caracteres, mas agora as linhas recuadas permanecerão recuadas.
  6. A expressão sed exclui linhas vazias.
por 25.08.2017 / 20:32