como fazer formatação de um arquivo no unix

0

Eu tenho um arquivo file.txt . que têm menos de três registros.

<ResultDescxmlns="http://www.mpaet.com/boe/interface/common">Operation successful.
220095
9251000014

Agora meu formato desejado deve estar como abaixo.

9251000014|220095|Operation successful
    
por user3548033 25.04.2016 / 14:30

6 respostas

0

Aqui está outra solução:

sed 's/^<[^>]*>//g' file.txt | tr '2' '|' | awk -F'|' '{OFS=FS; print $3,$2,$1}'
9251000014|220095|Operation successful.

Se você quiser remover o . à direita, poderá fazer isso com sed ou awk (não é necessário para ambos). Aqui está uma solução drop-in com sed :

sed -e 's/^<[^>]*>//g' -e 's/\.$//' file.txt
    
por 25.04.2016 / 16:48
1

Usando "perl" e expressão regular

perl -0777 -pe 's/<ResultDescxmlns=.*?>([^\n]*).([^\n]*).([^\n]*)/||/gs' file.txt

Isso extrairá as três linhas que seguem a tag ResultDescxmlns e as reorganizará na ordem desejada.

    
por 25.04.2016 / 15:23
1

sed :

sed -rn 's/<ResultDescxmlns.*>(.*)//;N;N;s/\n/ /g;s/([^.]*). ([0-9]*) ([0-9]*)/||/p'

s/.*ResultDescxmlns.*>(.*)// : encontre a correspondência da linha .*ResultDescxmlns.*>(.*) get string após > in

N;N; : Adicione as próximas 2 linhas à linha atual

s/\n/ /g : substitua a nova linha pelo espaço

s/([^.]*). ([0-9]*) ([0-9]*)/||/p : corresponde à regex e reorganiza a ordem para obter a saída desejada

    
por 25.04.2016 / 16:25
0

Isso funciona nos seus dados. Talvez você possa dar mais informações sobre o que você precisa.

awk -F'>' '/ResultDescxmlns/{ a = $2; getline b; getline c; printf "%s|%s|%s\n",c,b,a }' <file.txt

Quando ele corresponde a uma palavra em uma linha, ele divide a linha no char > e coloca o campo 2 na variável a. Ele chama getline para ler a próxima linha na variável b e novamente c. Imprime essas variáveis com o formato desejado na ordem indicada. (Eu deixei o% final . na variável a. Você pode removê-lo com sub(/\./,"",a); ).

    
por 25.04.2016 / 14:53
0

Se o arquivo.txt tiver apenas 3 linhas, isso também funciona:

l3=$(tail -1 file.txt)
l2=$(tail -2 file.txt | head -1)
l1=$(tail -3 file.txt | head -1 | cut -d">" -f2)
echo $l3"|"$l2"|"$l1
    
por 25.04.2016 / 14:58
0

Você pode usar o seguinte código:

awk -F"[>\n]" -v RS="" '{print $4"|"$3"|"$2}'
    
por 26.04.2016 / 20:51