Extraindo 2 partes de uma string usando awk [closed]

0

Eu gostaria de extrair e imprimir dois padrões de uma string

Meu arquivo tem centenas de linhas de texto, mas aqui estão duas delas. Cada linha tem um marcador F1, F2, F4, F4, F5, F6 e F7 e cada um desses marcadores é seguido por 4 caracteres.

F1A308F2A309 F3A310F4A311 F5A312F6A313F7A314

F1B308F2B309 F3B310F4B317 F5B312F6B313F7B315

Eu gostaria de extrair os 4 caracteres após o padrão "F2" e os 4 caracteres após o padrão "F6" para que a saída seja

A309 A314

B309 B313

Para esclarecer mais, preciso extrair apenas os caracteres após F2 e F4.

    
por Allan GItobu 12.07.2018 / 20:33

3 respostas

1

O script awk a seguir é uma aproximação do que eu acho que é sua exigência:

{
  for(i=1;i<=NF;i++) {
    if (match($i, "F2....$") > 0) {
      printf "%s ", substr($i, RSTART + 2, 4);
    }
    if (match($i, "F6....$") > 0) {
      printf "% s", substr($i, RSTART + 2, 4);
    }
  }
  print ""
}

Faz um loop em cada linha e, em seguida, percorre cada campo dessa linha. Para cada elemento, se a extremidade final do elemento tiver "F2" seguida de 4 caracteres, imprima esses 4 caracteres seguidos de um espaço. Uma vez feito o loop de uma linha, imprima um retorno de carro.

A saída, com base na sua entrada, é:

A309 A314

B309 B315

Uma versão atualizada do script awk, para manipular os elementos existentes em qualquer lugar dentro de seu campo, só precisa da $ anchoring removed:

{
  for(i=1;i<=NF;i++) {
    if (match($i, "F2....") > 0) {
      printf "%s ", substr($i, RSTART + 2, 4);
    }
    if (match($i, "F6....") > 0) {
      printf "% s", substr($i, RSTART + 2, 4);
    }
  }
  print ""
}
    
por 12.07.2018 / 21:32
1

Com Perl, usando um lookbehind para os caracteres âncora:

$ perl -lne 'print join " ", /(?<=F2|F6)(.{4})/g' file
A309 A313

B309 B313
    
por 13.07.2018 / 00:18
0

Que tal isso:

echo 'str' | egrep -o '(F2|F6)....' | egrep -o '....$' | xargs -n2
    
por 12.07.2018 / 20:54

Tags