Anexar o segundo campo da segunda linha à primeira linha do arquivo

0

como gerar o seguinte arquivo (exemplo in) para o arquivo, conforme descrito no exemplo,

cada última palavra na linha de estado (exemplo em), deve ser adicionada à última linha da linha anterior

exemplo em

    HDFS  worker01.gtdns.com
    state  STARTED
    HDFS  worker02.gtdns.com
    state  STOP
    HDFS  worker03.gtdns.com
    state  STARTED
    HDFS  worker05.gtdns.com
    state  STARTED
    HDFS  worker06.gtdns.com
    state  STARTED
    HDFS  worker07.gtdns.com
    state  STARTED
    HDFS  worker08.gtdns.com
    state  STARTED
    HDFS  worker09.gtdns.com
    state  STOP

exemplo fora (resultados esperados)

    HDFS  worker01.gtdns.com STARTED
    HDFS  worker02.gtdns.com STOP
    HDFS  worker03.gtdns.com STARTED
    HDFS  worker05.gtdns.com STARTED
    HDFS  worker06.gtdns.com STARTED
    HDFS  worker07.gtdns.com STARTED
    HDFS  worker08.gtdns.com STARTED
    HDFS  worker09.gtdns.com STOP
    
por yael 08.01.2018 / 23:44

6 respostas

1
awk '$1 == "HDFS" { printf( "%s ", $0 ) }; $1=="state" { print $2 }' /path/to/input

O script awk é bastante autoexplicativo: Nas linhas em que o primeiro campo é HDFS , acrescente um espaço à linha e imprima-o como está sem nenhuma nova linha à direita. Nas linhas em que o primeiro campo é state , imprima o segundo campo com a nova linha final (implícita).

    
por 08.01.2018 / 23:51
1

gnu awk golfing:

$ awk '1' RS='\n[ \t]*state ' ORS='' file

Teste:

$ awk '1' RS='\n[ \t]*state ' ORS='' file
HDFS  worker01.gtdns.com STARTED
HDFS  worker02.gtdns.com STOP
HDFS  worker03.gtdns.com STARTED
HDFS  worker05.gtdns.com STARTED
HDFS  worker06.gtdns.com STARTED
HDFS  worker07.gtdns.com STARTED
HDFS  worker08.gtdns.com STARTED
HDFS  worker09.gtdns.com STOP

RS é o separador de registro de entrada em ORS é o separador de registro de saída

    
por 09.01.2018 / 00:09
0

Abordagem do Short GNU AWK :

awk -v RS='[[:space:]]+state' '{ printf "%s", $0 }' file
  • -v RS='[[:space:]]+state' - trata state substring com espaço (s) principal (es) [[:space:]]+ como separador de registro de entrada RS

A saída:

HDFS  worker01.gtdns.com  STARTED
HDFS  worker02.gtdns.com  STOP
HDFS  worker03.gtdns.com  STARTED
HDFS  worker05.gtdns.com  STARTED
HDFS  worker06.gtdns.com  STARTED
HDFS  worker07.gtdns.com  STARTED
HDFS  worker08.gtdns.com  STARTED
HDFS  worker09.gtdns.com  STOP

Para um formato estático "2-lined" - você também pode tentar a seguinte abordagem SED :

sed '/^[[:space:]]*HDFS/{ N; s/[[:space:]]*state // }' file
    
por 09.01.2018 / 00:14
0

Usando ex , o editor de arquivos com script especificado pelo POSIX :

printf '%s\n' 'g/state/s/^ *state *//|-j' x | ex file.txt

O comando s é uma substituição padrão. O -j significa "na linha anterior ( - ), execute o comando de junção ( j )", que une a linha subsequente a uma separação de espaço.

Na verdade, como o comando j oin ignora os espaços iniciais na linha a serem unidos, e porque s reutiliza a expressão regular anterior se nenhuma regex é fornecida, o comando a seguir funciona da mesma forma e fornece o mesmo resultado:

printf '%s\n' 'g/state/s///|-j' x | ex file.txt

Observe que isso salva as alterações no arquivo. Para visualizar as alterações sem salvá-las, use o seguinte:

printf '%s\n' 'g/state/s///|-j' %p | ex file.txt
    
por 09.01.2018 / 00:34
0

Supondo que sempre haja um estado após o HDFS, isso resolve o problema:

awk '$1=="HDFS"{l=$0;next};$1=="state"{print(l,$2);l=""}' file

$1=="HDFS"{ … } Para linhas, o campo 1 é HDFS do .
l=$0;next Armazena linha em var l (elle, line) move para a próxima linha.
$1=="state"{ … } para linhas que o campo 1 é state do…
{print(l,$2)} imprime a linha armazenada em var l (elle) e campo 2.
{l=""} Evita imprimir valores obsoletos (antigos) de l .

    
por 08.01.2018 / 23:59
0

Obteve o resultado usando abaixo um liner

 sed "s/state//g" filename| sed "N;s/\n/ /g"

saída

HDFS  worker01.gtdns.com   STARTED
HDFS  worker02.gtdns.com   STOP
HDFS  worker03.gtdns.com   STARTED
HDFS  worker05.gtdns.com   STARTED
HDFS  worker06.gtdns.com   STARTED
HDFS  worker07.gtdns.com   STARTED
HDFS  worker08.gtdns.com   STARTED
HDFS  worker09.gtdns.com   STOP
    
por 09.01.2018 / 03:49