Extraindo parte de uma coluna específica no arquivo de texto

3
ffmj0010.09o:FFMJ                                                  MARKER NAME
ffmj0020.09o:BRMU                                                  MARKER NAME

Neste arquivo de texto (2 linhas e sem espaço entre as linhas) eu preciso extrair 4 caracteres depois de ":" ("FFMJ", "BRMU") e salvá-los em outro arquivo de texto. Qual comando eu preciso usar?

    
por deepblue_86 19.10.2015 / 16:06

4 respostas

3

Usando sed :

sed 's/.*:\(.\{4\}\).*//' in > out
  • s : afirma para executar uma substituição
  • / : pára o comando / inicia o padrão
  • .*: : corresponde a qualquer número de qualquer caractere até o último caractere : e um caractere :
  • \(.\{4\}\) : corresponde e agrupa 4 ocorrências de qualquer caractere
  • .* : corresponde a qualquer número de qualquer caractere
  • / : interrompe o padrão / inicia a sequência de substituição
  • : backreference substituído pelo primeiro grupo capturado
  • / : interrompe a sequência de substituição / inicia os sinalizadores de padrão

Exemplo de saída no arquivo de exemplo:

% cat in
ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME
% sed 's/.*:\(.\{4\}\).*//' in > out
% cat out
FFMJ
BRMU
    
por kos 19.10.2015 / 16:17
3

Usando awk e vários delimitadores

awk -F'[: ]' '{print }' in > out

Exemplo

$ cat in
ffmj0010.09o:FFMJ                                                  MARKER NAME
ffmj0020.09o:BRMU                                                  MARKER NAME

$ awk -F'[: ]' '{print }' in 
FFMJ
BRMU
    
por A.B. 19.10.2015 / 16:20
3

Se tiver certeza de que deseja exatamente 4 caracteres antes do final da linha, faça:

grep -Eo '.{4}$' file.txt >out.txt

Caso contrário, você pode ir para grep com PCRE para obter todos os caracteres após : até o final da linha:

grep -Po '.*:\K[^:]+$' file.txt >out.txt

Você também pode usar a expansão do parâmetro bash :

while IFS= read -r line; do echo "${line##*:}"; done <file.txt >out.txt

EDITAR:

Como @kos apontou, eu poderia ter entendido mal a questão, se você quiser exatamente 4 caracteres depois de : , você pode fazer:

grep -Po '.*:\K.{4}' file.txt >out.txt
    
por heemayl 19.10.2015 / 16:17
1

Usando grep :

cat oldFile | grep -o ":[A-Z]*" | grep -o "[A-Z]*" > newFile
cat oldFile |                                         # Read the file
               grep 
                    -o                                # Only give the greped data
                       ":[A-Z]*"                      # Find a : followed by 4
                                                      #  4 capital letters
                                 | grep -o "[A-Z]*"   # Remove the : from that

Em seguida, o > newFile é enviado para um arquivo.

No exemplo:

ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME

vai para

FFMJ
BRMU
    
por Tim 19.10.2015 / 16:26