Separar um arquivo com registros de cabeçalho incorporados em dois arquivos

2

Eu gostaria de separar o seguinte arquivo de texto de exemplo em dois arquivos separados com base no registro de cabeçalho incorporado usando um script unix:

CSI 447907 890947967201270
776666666   B
771555555   B
774444444   B
REL 447904 890947967201270
772222222   A
771111111   B+
770000000   A
CSI 447911 891096722201270
774444444   B+
778888888   A
779999999   A
REL 171077 889928722201270
774444444   B
773333333   B+
772222222   B+
771111111   C
PHY 114926 891987278201270
123456789   A
987654321   A
777777777   B+

Os arquivos de resultados:

Arquivo de texto 1

CSI 447907 890947967201270
776666666   B
771555555   B
774444444   B
CSI 447911 891096722201270
774444444   B+
778888888   A
779999999   A

Arquivo de texto 2

REL 447904 890947967201270
772222222   A
771111111   B+
770000000   A
REL 171077 889928722201270
774444444   B
773333333   B+
772222222   B+
771111111   C
PHY 114926 891987278201270
123456789   A
987654321   A
777777777   B+

O número de registros de cabeçalho pode variar, assim como o número de registros detalhados. As colunas / campos são estáticos. O primeiro arquivo de texto contém os cabeçalhos CSI e os registros de detalhes correspondentes, enquanto o segundo é o que resta.

    
por Steven 28.01.2013 / 19:47

2 respostas

3

Outro trabalho típico para o awk:

POSIXLY_CORRECT=1 LC_ALL=C awk '
  $1 ~ /^[A-Z]{3}$/ {
    if ($1 == "CSI")
      file = "csi.txt"
    else
      file = "rest.txt"
  }
  file {print > file}'

POSIXLY_CORRECT é apenas no caso de seu awk ser o GNU awk que não reconhece o {...} a menos que esteja no modo de conformidade padrão.

LC_ALL=C é garantir que [A-Z] signifique o caractere ASCII de A a Z , caso contrário, esse intervalo pode incluir outros caracteres, dependendo das configurações de localização.

Se estiver no Solaris, use command -p awk ou /usr/xpg4/bin/awk , caso contrário, você pode acabar com /bin/awk , que não deve mais ser usado.

    
por 28.01.2013 / 20:51
2

Eu usei um loop while e li o primeiro cabeçalho CSI. Então eu pude escrever os registros de cabeçalho e detalhe.

Isso é o que eu tenho até agora:

file="data.txt"
STR=CSI
while IFS= read -r line
do
    if [[ ${line} = @(${STR}*) ]] then
    echo $line > file2.txt
    while IFS= read -r line2
    do
      echo $line2 >> file2.txt
    done
    fi
done <"$file"

Steven

    
por 28.01.2013 / 20:47

Tags