awk: Como selecionar várias substrings a partir do arquivo de tamanho fixo?

1

Eu pesquisei e pesquisei, mas ainda não encontrei uma resposta para isso. A ideia é que eu tenha um arquivo dat do qual alguns dos campos de dados são necessários.

Exemplo de dados (test.dat)

50DI 20170510144200Mike   Tester       BL0004992000US
50ELI20170509145200Roy    Developer    BL0003400020MX

Então, no caso eu gostaria de ter o segundo campo de dados a partir da posição 3 (DI ou ELI) com comprimento de três eu faria isso:

awk '{print substr($0,3,3)}' test.dat

Mas não consigo descobrir como obter vários campos de dados do arquivo de dados original. O melhor que eu tenho é este (editado como eu copiei a versão mais antiga).

#!/bin/bash

for i in {1..1}; do
    a=$(awk '{print substr($0,0,2)}' test.txt)
    b=$(awk '{print substr($0,20,7)}' test.txt)
    echo $a, $b
done

quais resultados como

50 50, Mike Roy

em vez de

50, Mike
50, Roy

O exemplo é um pouco básico, a idéia continua a mesma: como eu obtenho várias substrings com o awk? (Disclaimer: Eu não sou casado com awk, eu só quero ficar melhor com isso. Quaisquer outras soluções são muito apreciadas também!)

    
por dirikka 10.05.2017 / 16:28

3 respostas

3

Com o GNU awk , supondo que você realmente queira larguras fixas:

awk -v FIELDWIDTHS='2 17 7' -v OFS=', ' '{ print $1, $3 }' test.dat

com bash :

while read -r line; do
    printf '%s, %s\n' "${line:0:2}" "${line:19:7}"
done <test.dat

Com um pouco atual sed :

sed 's/^\(..\).\{17\}\(.\{7\}\).*/, /' test.dat

com perl :

perl -lpe '$_ = join ", ", unpack "A2x17A7"' test.dat

Saída, para qualquer um dos itens acima:

50, Mike
50, Roy
    
por 10.05.2017 / 16:54
1

Que tal cut ?

cut -c1-2,20-26 --output-delimiter ', ' test.dat
50, Mike
50, Roy
    
por 10.05.2017 / 17:18
0

Abordagem curta sed :

sed -En 's/^(.{2}).{17}(\S+).*/, /gp' test.dat

A saída:

50, Mike
50, Roy
    
por 10.05.2017 / 17:07

Tags