Anexa uma linha a um arquivo com uma palavra ausente

4

Eu tenho um arquivo chamado xyz.txt e ele contém três linhas, como

I am ok.
I am fine.
all good.

Eu preciso encontrar uma linha que não contenha am e anexe a linha à linha anterior

Para o exemplo dado, a saída que eu preciso é

I am ok.
I am fine. all good.

E também o script precisa ser aplicável a um arquivo de tamanho grande. Por exemplo, se houver 10 linhas em um arquivo e 'am' estiver faltando nas linhas 3 e 7, a linha 3 deve ser anexada à segunda linha e a sétima linha anexada à sexta linha.

    
por sabarish 24.10.2017 / 09:38

2 respostas

4
Solução

awk (assumindo aqui o GNU ou busybox awk para os operadores de limite \< , \> word):

Amostra estendida file :

I am ok.
I am fine.
all good.
am I sleeping?
how's that
I am sure
about that
and think on.
For that I am now
awk '{ printf "%s%s",(NR==1? "": (!/\<am\>/? OFS:ORS)),$0 }END{ print "" }' file
  • "%s%s" - string de formato com 2 especificações. O primeiro %s deles se para o delimitador "principal" do item em potencial:
    • para o primeiro registro ( NR==1 ), será "" (string vazia)
    • para registros que não contêm am word - OFS (separador de campo de saída, ou seja, espaço)
    • para registros contendo am word - ORS (separador de registro de saída, ou seja, a nova linha por padrão)

A saída:

I am ok.
I am fine. all good.
am I sleeping? how's that
I am sure about that and think on.
For that I am now
    
por 24.10.2017 / 09:46
4

com sed :

sed -e ':a' -e 'N;/\n.*am/!s/\n/ /;ta' -e 'P;D'

Explicação:

  • Anexar a linha seguinte N (ou imprimir a última linha e terminar)
  • Se a segunda linha não incluir am (o% arrastando ! nega o padrão de endereço \n.*am ), substitua a nova linha por um espaço
  • Se essa substituição foi feita, faça o loop para o início para acrescentar outra linha, se necessário ( ta é um salto condicional para marcar :a )
  • Se a segunda linha contiver am (nenhuma substituição foi feita), P;D imprime a primeira linha e recomeça com a segunda linha

Eu vejo, você parece usar o linux. Com o GNU sed você pode simplesmente escrever

sed ':a;N;/\n.*am/!s/\n/ /;ta;P;D'
    
por 24.10.2017 / 09:55