Eu tenho um myfile.txt
que contém vários tipos de registro.
O tipo de registro está na posição 27, com comprimento de 3 caracteres, assim:
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456I49XXXXXXXXX
12345678901234567890123456I50XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456Q11XXXXXXXXX
12345678901234567890123456R11XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456I47XXXXXXXXX
12345678901234567890123456I49XXXXXXXXX
12345678901234567890123456I50XXXXXXXXX
12345678901234567890123456Q11XXXXXXXXX
12345678901234567890123456R11XXXXXXXXX
12345678901234567890123456W55XXXXXXXXX
Eu gostaria de dividi-lo por tipo de registro, assim:
grep -E '^.{26}(E20)' myfile.txt > E20.txt
grep -E '^.{26}(I47)' myfile.txt > I47.txt
grep -E '^.{26}(I49)' myfile.txt > I49.txt
grep -E '^.{26}(I50)' myfile.txt > I50.txt
grep -E '^.{26}(Q11)' myfile.txt > Q11.txt
grep -E '^.{26}(R11)' myfile.txt > R11.txt
grep -E '^.{26}(W55)' myfile.txt > W55.txt
e fazer outra coisa, por exemplo
echo "Unexpected record type"
quando o tipo de registro não está em (E20, I47, I49, I50, Q11, R11, W55).
Por exemplo, E20.txt
o arquivo será:
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
12345678901234567890123456E20XXXXXXXXX
e assim por diante.
Existe uma maneira elegante de fazer isso (em um script) no Linux?
Aqui está uma
awk
maneira. Primeiro, crie um arquivo com os registros "bons", um por linha:Então:
Usando qualquer awk e qualquer tipo:
O acima usa o idioma DSU (Decorate/Sort/Undecorate) para tornar o script muito eficiente, robusto e portátil, mantendo a ordem de entrada para chaves duplicadas.