Que comando LINUX deve ser usado para a tarefa 'cortar e substituir uma coluna'?

3

link

Este é o arquivo. Aqui, eu preciso substituir a sexta coluna com números de 1 a 158, respectivamente.

A saída deve ser como link

Como faço isso usando comandos do Linux? Agradecemos antecipadamente.

    
por Shilpa Janarthanan 15.03.2017 / 21:01

1 resposta

2

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
    
por Sergiy Kolodyazhnyy 15.03.2017 / 21:14