Como extrair linhas por palavras em posição específica, não em coluna?

5

Eu tenho um arquivo de entrada como este:

                     v
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
TER    1648      ILE C 206
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99
                     ^

Apenas linhas contendo A na posição marcada são o que eu preciso. Na maioria das linhas, A é um único caractere como uma quinta coluna como a primeira linha. No entanto, às vezes é na quarta coluna como a segunda linha, ou em uma string como a última. Observe que A como um único caractere pode aparecer em outras posições além de 22, mas eu só me importo quando está aqui.

Eu preciso que minha saída tenha apenas linhas com A , independentemente de estar em uma única string:

ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99

Mas às vezes também quero extrair apenas linhas com A , independentemente da coluna:

ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
    
por Ooker 29.05.2014 / 02:05

6 respostas

7

Você pode usar

grep -E '^.{21}A' file

se você quiser incluir casos como A1023 e

grep -E '^.{21}A\>' file

se você quiser apenas linhas em que A apareça como um caractere isolado

OBSERVAÇÃO: No segundo exemplo, a notação \ > irá corresponder a qualquer string vazia final.

trecho da página man grep

The Backslash Character and Special Expressions

The symbols \< and \> respectively match the empty string at the beginning and end of a word. The symbol \b matches the empty string at the edge of a word, and \B matches the empty string provided it's not at the edge of a word. The symbol \w is a synonym for [_[:alnum:]] and \W is a synonym for [^_[:alnum:]].

    
por 29.05.2014 / 02:15
5

bash:

while IFS= read -r line; do 
    [[ ${line:21:2} == "A " ]] && echo "$line"
done < file
    
por 29.05.2014 / 02:15
3
> awk -v FS= '{ print $22 }' file
A
A
C
A

> awk -v FS= '$22=="A" { print; }' file
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99
    
por 29.05.2014 / 02:11
3

Um ponto que eu notei sobre os dados que você descreve é que o seu A - independente da posição da coluna - é o caractere alfabético last na linha. Isso significa que podemos abordá-lo sistematicamente assim:

sed -n '\|.*\(A\)[ 0-9.]*$|s|||p'

Isso retorna apenas o A , mas se você quiser que toda a linha altere apenas o para um & .

    
por 29.05.2014 / 04:37
2

com GNU grep :

$ grep -P '\bA\b' file
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
    
por 29.05.2014 / 04:22
2

Outro comando awk, independentemente da posição de A,

$ awk '$4~/A$/ || $5~/^A/' file
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
HETATM 1668  O   HOH A1023      25.873  38.343   2.138  1.00 21.99

E as linhas que consistem em space A space

$ awk '/ A /' file
ATOM     57  O   LYS A   7       2.254  25.484  18.942  1.00 14.46
ATOM     77  NH1AARG A   8       5.557  19.204  13.388  0.55 24.50
    
por 29.05.2014 / 08:46