Aqui está um pequeno script do Python 3, que faz o trabalho. A premissa subjacente aqui é ler cada caractere de linha por caractere, usar duas variáveis - uma que controla se os sublinhados da coluna da primeira para a segunda foram escritos e outra - que controla se podemos substituir o espaço pelo sublinhado.
Eu notei no formato de arquivo de entrada do OP que a segunda coluna é todos os valores numéricos. Assim, podemos começar com a permissão de espaços serem substituídos por sublinhados, mas uma vez que escrevemos sublinhados e encontramos um caractere numérico (ambas as condições são verdadeiras), podemos desativar a variável write_ok
, e os outros espaços serão impresso como de costume.
#!/usr/bin/env python3
import sys
import os
def count_first_spaces(string):
write_ok = True
underscores_ok = False
for char in string:
if char == " " and write_ok:
print("_",end="")
underscores_ok = True
continue
if underscores_ok and char.isdigit():
write_ok = False
print(char,end="")
print("") # add newline
def main():
if not os.path.isfile(sys.argv[1]): sys.exit(1)
with open(sys.argv[1]) as fd:
for line in fd:
if line.startswith('#'): print(line.strip())
else: count_first_spaces(line.strip())
if __name__ == '__main__': main()
E aqui está o teste:
$ ./add_underscore.py input.txt
#CHROM POS REF ALT ../S101_sorted.bam ../S102_sorted.bam ../S105_sorted.bam ../S107_sorted.bam ../S113_sorted.bam ../S114_sorted.bam ../S115_sorted.bam ../S
Aradu.A01_______296611 T C T T T T T T T T T T T T T T T/C T T/C T T T T
Aradu.A01_______326689 T C T/C T T T T/C T T T T/C T/C T T T T T T T T/C T/C T T
Aradu.A01_______615910 T G T T T T T T T T T T T T T T T T T T T T T
Aradu.A01_______661394 T A T T T T T T/A T T T T T T T T T T T T T T T
Se você quiser que os dados sejam salvos em um arquivo diferente, execute-o como ./add_underscore.py input.txt > output.txt