O que você solicita é basicamente incrementar um contador sempre que a coluna 4 for alterada. O comando awk
abaixo faz exatamente isso.
$ awk ' != last{count++};{=count;last=};1' input.txt
ATOM 1149 N MET B 1 56.923 131.264 45.113 1.00140.13 N
ATOM 1150 CA MET B 1 58.169 131.437 44.333 1.00140.13 C
ATOM 1151 C MET B 1 58.225 130.444 43.220 1.00140.13 C
ATOM 1152 O MET B 1 58.569 130.785 42.089 1.00140.13 O
ATOM 1153 CB MET B 1 59.401 131.239 45.231 1.00140.13 C
ATOM 1154 CG MET B 1 59.536 129.826 45.799 1.00140.13 C
ATOM 1155 SD MET B 1 58.315 129.397 47.077 1.00140.13 S
ATOM 1156 CE MET B 1 59.098 130.370 48.397 1.00140.13 C
ATOM 1157 N SER B 2 57.860 129.183 43.517 1.00 86.33 N
ATOM 1158 CA SER B 2 57.898 128.164 42.517 1.00 86.33 C
ATOM 1159 C SER B 2 56.887 128.522 41.486 1.00 86.33 C
ATOM 1160 O SER B 2 55.901 129.195 41.780 1.00 86.33 O
ATOM 1161 CB SER B 2 57.559 126.761 43.047 1.00 86.33 C
ATOM 1162 OG SER B 2 56.212 126.721 43.495 1.00 86.33 O
ATOM 1163 N ALA B 3 57.122 128.084 40.237 1.00 45.56 N
ATOM 1164 CA ALA B 3 56.217 128.412 39.183 1.00 45.56 C
ATOM 1165 C ALA B 3 55.730 127.143 38.568 1.00 45.56 C
ATOM 1166 O ALA B 3 56.393 126.109 38.624 1.00 45.56 O
ATOM 1167 CB ALA B 3 56.865 129.235 38.059 1.00 45.56 C
Teoria da operação
Cada comando do awk pode ser estruturado desta forma:
awk '/Condition/ {code block to run on condition};'
Se a condição estiver ausente, o bloco de código é executado para qualquer linha, independentemente do seu conteúdo. Neste exemplo, verificamos se o campo (coluna) foi alterado (
!= last
, como o campo 4 não é igual à variável last
). Se a condição for verdadeira (o que será cada vez que muda e na primeira linha, quando a última não está definida ainda), incrementamos a variável count
.
O próximo bloco de código {=count;last=}
será executado independentemente da linha em que estivermos. Apenas atribuímos o conteúdo da variável count
ao campo 6 e registramos o que vimos no campo 4. A variável count
passará a existir quando o script encontrar a primeira linha do texto e será criada quando o comando avaliar != last
parte. last
, por outro lado, virá a existir quando o código avaliar {=count;last=}
part.
Finalmente, 1
no final é simplesmente um truque para fazer com que a condição sempre seja avaliada como "verdadeira" e impressa. Apenas uma abreviação em vez de {print}
block.
Para salvar o resultado em um arquivo, use o operador >
shell para redirecionar a saída no shell. Por exemplo
awk ' != last{count++};{=count;last=};1' input.txt > output.txt