Filtre e copie a coluna do cabeçalho e cole no registro detalhado (Largura Fixa)

1

Eu tenho um requisito para copiar uma das colunas de cabeçalho em um arquivo de largura fixa e criar um novo campo no registro de detalhes e, em seguida, colar o campo nesse espaço reservado.

Nota: Há vários registros de cabeçalho e detalhe em um arquivo e dados de arquivo de amostra com saída esperada, como segue.

Tipo de registro: H-Header, D-Detail. Por favor, sugira como fazer isso usando comandos unix

Entrada:

H0003A

D0001A

D0002A

D0003A

H0007A

D0001A

D0002A

D0003A

D0004A

D0005A

D0006A

D0007A

H0002B

D0001B

D0002B

H0004A

D0001A

D0002A

D0003A

D0004A

Resultado esperado:

H0003A

D0001A3

D0002A3

D0003A3

H0007A

D0001A7

D0002A7

D0003A7

D0004A7

D0005A7

D0006A7

D0007A7

H0002B

D0001B2

D0002B2

H0004A

D0001A4

D0002A4

D0003A4

D0004A4
    
por Chakkara 30.06.2018 / 16:33

3 respostas

2

Então, aparentemente, você deseja adicionar o quinto caractere de cada linha de cabeçalho ao final de cada linha sem cabeçalho. Em Awk:

awk 'BEGIN{OFS=FS=""} /^H/ {x = $5} /^D/ {$(NF+1) = x} 1'

ou (digitando um pouco mais, mas evita a comparação de expressões regulares)

awk 'BEGIN{OFS=FS=""} $1=="H" {x = $5} $1=="D" {$(NF+1) = x} 1'

Similarmente em Perl:

perl -F'' -ple '$_ .= $x if $F[0] eq "D"; $x = $F[4] if $F[0] eq "H"'

Pelo intencionalmente perverso

sed -e '/^H/ {p;s/.$//;h;d;}' -e '/^D/ {G;s/\n....//;}'
    
por 30.06.2018 / 17:10
0

O Bash geralmente não deve ser usado como processador de texto, mas isso deve ser feito se não houver soluções melhores:

#!/bin/bash

input=/path/to/input
output=/path/to/output

while read -r record; do
    if [[ "${record:0:1}" == 'H' ]]; then
        x=$(awk -vr=${record//[[:alpha:]]/} 'BEGIN{print r / 1}')
        echo "$record"
    elif [[ -z "$record" ]]; then
        echo
    else
        echo "${record}${x}"
    fi
done <"$input" >"$output"

Isso lerá sua linha de entrada por linha. Se o registro começar com H , ele irá capturar o número e dividi-lo por 1 (para remover os zeros à esquerda) e salvá-lo na variável x e, em seguida, echo no registro do arquivo de saída. Se o registro for uma linha em branco, será apenas echo uma linha em branco na saída. Se o registro não começar com H , echo será usado com a variável x no final.

    
por 30.06.2018 / 17:03
0

Com o GNU awk, assumindo que nem todos os números adicionados serão apenas 1 dígito

gawk 'match($0, /^H0*([0-9]+)/, m) {n = m[1]} /^D/ {$0 = $0 n} 1' file
    
por 30.06.2018 / 21:08