Remover palavras (letras seguidas de espaço) de uma coluna específica

1

Eu tenho um arquivo e o formato é o seguinte:

cat dog AHF123432 | 123432 | dhfshfjdh
lion  AFG23412 |23412 | dfshjhfjdhj

Eu preciso remover essas palavras da primeira coluna que contém apenas alfabetos, ou seja, gato (seguido de espaço) e cachorro da primeira linha e leão da segunda fila

Minha saída será parecida com:

AHF123432 | 123432 |  dhfshfjdh    
AFG23412 | 23412 | dhfshfjdh
    
por frozen_dreams 12.08.2015 / 19:38

3 respostas

1

Isso remove todas as palavras com letras puras desde o começo da linha:

$ sed -r 's/^([[:alpha:]]* )*//' filename.tsv
AHF123432 | 123432 | dhfshfjdh
AFG23412 |23412 | dfshjhfjdhj

Ou para salvar a saída em um novo arquivo:

sed -r 's/^([[:alpha:]]* )*//' filename.tsv > final.tsv

Como funciona

  • [[:alpha:]]* corresponde a qualquer número de caracteres alfabéticos seguido por um espaço. Em outras palavras, corresponde a uma palavra seguida por um espaço.

    Mais detalhadamente, [[:alpha:]] corresponde a um único caractere alfabético. '' [[: alpha:]] * 'corresponde a qualquer número desses caracteres.

  • ([[:alpha:]]* )* corresponde a qualquer número dessas palavras seguido por espaços.

  • ^([[:alpha:]]* )* corresponde a qualquer número de palavras seguido por espaços, mas por causa do ^ , apenas a partir do início da linha.

  • O comando substituto remove todas as palavras correspondentes. O comando substituto tem o formato s/old/new/ onde, aqui, old é a nossa expressão acima, que corresponde a qualquer número de palavras a partir do início da linha. Queremos substituir essas palavras por nada, então, usamos a string vazia para new .

Antigamente, a expressão regular para corresponder a caracteres alfabéticos era [a-zA-Z] . Com fontes unicode modernas, isso agora é mais confiável. Como nossa expressão regular acima usa [:alpha:] , ela é segura para unicode.

    
por 12.08.2015 / 20:20
0

Se o seu grep é compatível com p erl c ompatible r egular e xpressions:

grep -Po '^([a-z]* +)*\K.*'

ou

pcregrep -o '^([a-z]* +)*\K.*'
    
por 12.08.2015 / 20:14
0

Usando awk

awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo

Exemplo

% cat foo
cat dog AHF123432 | 123432 | dhfshfjdh
lion AFG23412 | 23412 | dfshjhfjdh

% awk -F'|' '{for (i=1; i<=NF;i++) {gsub(/([a-z]|[A-Z])+ /,"",$i); printf "%s",$i; if(i<NF) {printf "|"} else { printf "\n"}}}' foo
AHF123432 | 123432 | dhfshfjdh
AFG23412 | 23412 | dfshjhfjdh
    
por 13.08.2015 / 08:47