Les deux premiers champs doivent être séparés par _ et le rest des champs tels qu'ils sont

#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 TCTTTTTTTTTTTTTTT/CTT/CTTTT Aradu.A01 326689 TCT/CTTTT/CTTTT/CT/CTTTTTTTT/CT/CTT Aradu.A01 615910 TGTTTTTTTTTTTTTTTTTTT TT Aradu.A01 661394 TATTTTTT/ATTTTTTTTTTTTTTT Aradu.A01 941674 CTCC/TCCC/TCCCCCCCCCCCCCCCC Aradu.A01 942064 CTC/TC/TC/TC/TC/TCCC/TCC/TC/TCCC/TC/TCCCCC/TC/T Aradu.A01 954858 GAG/AGGGGGGGGGGGGGGGG/AGGGG Aradu.A01 1196780 CAC/ACCCCCCCCCCC/ACCC/ACCCCCC 

J'ai un file au format ci-dessus et j'essaie d'imprimer les deux premières colonnes séparées par _ et le rest des colonnes telles qu'elles sont. J'ai essayé le script awk suivant: il ne returnne aucune sortie.

 awk '{if (NR>1) print $1"_"$2; for(i=3;i<NF;i++) printf "\t", $i}' input_file > out_file. 

Est-ce que quelqu'un peut suggérer ce que je fais mal ici?

Pour changer les espaces entre les deux premières colonnes à un trait de soulignement, je suggère sed :

  sed -e 's/[\t ]\+/_/' 

Et si vous deviez ignorer la ligne d'en-tête:

 sed -e '/^#/! s/[\t ]\+/_/' 

ou, pour le cas plus général (l'en-tête pourrait commencer avec n'importe quel char; \t ne fonctionne qu'avec gnu sed )

 sed -E '1! s/[[:blank:]]+/_/' 

Quant à la question sur votre code awk , la première print , devrait probablement être un printf afin de ne pas l'imprimer un newline mal chronométré.

A partir de votre code, cela devrait vous donner la sortie désirée:

 awk ' NR>1 { printf( $1"_"$2 ); for (i=3;i<NF;i++) printf("\t%s", $i); printf("\n") } NR==1 { print } ' input > output 

Cela semble fonctionner:

 awk '{ if(NR>1) { printf $1"_"$2; for(i=3;i<NF;i++) {printf "\t"$i } } print "" }' input 

Voici un petit script Python 3, qui fait le travail. La prémisse sous-jacente ici est de lire chaque caractère de ligne en fonction de l'utilisation de deux variables – une qui vérifie si les soulignements de la première à la deuxième colonne ont été écrits, et une autre – qui vérifie si nous sums autorisés à substituer l'espace par le trait de soulignement.

J'ai remarqué du format de file d'input de OP que la deuxième colonne est toutes les valeurs numériques. Nous pouvons donc commencer par autoriser la substitution des espaces par des traits de soulignement, mais une fois que nous avons écrit des traits de soulignement et rencontré un caractère numérique (les deux conditions étant vraies), nous pouvons désactiver la variable write_ok et les autres espaces seront imprimés comme d'habitude.

 #!/usr/bin/env python3 import sys import os def count_first_spaces(ssortingng): write_ok = True underscores_ok = False for char in ssortingng: 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.ssortingp()) else: count_first_spaces(line.ssortingp()) if __name__ == '__main__': main() 

Et voici le test:

 $ ./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 TCTTTTTTTTTTTTTTT/CTT/CTTTT Aradu.A01_______326689 TCT/CTTTT/CTTTT/CT/CTTTTTTTT/CT/CTT Aradu.A01_______615910 TGTTTTTTTTTTTTTTTTTTT TT Aradu.A01_______661394 TATTTTTT/ATTTTTTTTTTTTTTT 

Si vous souhaitez que ces données soient sauvegardées dans un autre file, exécutez-le en tant que ./add_underscore.py input.txt > output.txt