Comment imprimer des colonnes continues et aléatoires sélectionnées avec awk

Je voudrais imprimer la 1ère à la 10ème colonne, la 23ème colonne et la 27ème colonne de ifile.txt. Je peux imprimer les 1ère à 10ème colonnes en utilisant

awk '{n=10; for (i=1;i<=n;i++) printf "%f ", $i; print "";}' ifile.txt 

Mais je ne peux pas y append les 23ème et 27ème colonnes.

J’ai essayé avec les suggestions suivantes, il y a toujours quelques problem.eg, mon ifile.txt est:

 ifile.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 

Pendant que j’utilise le suivant

 #!/bin/bash awk '{ n=10 for (i=1; i<=n; i++) a[$i] a[$23] a[$27] for (k in a) printf "%5.1f", k, FS print "" }' ifile.txt 

Il donne

 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 4.0 27.0 5.0 6.0 7.0 8.0 9.0 10.0 23.0 1.0 2.0 3.0 

Et pendant que j’utilise

 cut -d ' ' -f1-10,23,27 ifile.txt 

Il donne

 1 2 3 4 5 6 7 8 9 22 26 1 2 3 4 5 6 7 8 9 22 26 1 2 3 4 5 6 7 8 9 22 26 1 2 3 4 5 6 7 8 9 22 26 1 2 3 4 5 6 7 8 9 22 26 1 2 3 4 5 6 7 8 9 22 26 1 2 3 4 5 6 7 8 9 22 26 

Je pouvais comprendre cela et résolu en modifiant

 cut -d ' ' -f2-11,24,28 ifile.txt 

Le problème était qu’il y avait un espace avant que chacun ne commence. Mais je me demande une façon générale de le faire pour qu’elle ne voie pas l’espace de départ.

 $del=' ' cut -d "$del" -f1-10,23,27 file 

Afin de ne pas vous répéter avec printf , vous pouvez créer un tableau de tous les champs souhaités et les parcourir en boucle.

 { n=10 for (i=1; i<=n; i++) a[$i] a[$23] a[$27] for (k in a) printf "%f%s", k, FS print "" } 

Je suppose que vos champs sont délimités par des espaces.

Vous pouvez essayer avec la cut ,

 cut -d ' ' -f1-10,23-27 yourfile 

Explication:

 -d - Delimiter -f - Fields 

En Perl, vous pouvez essayer

 perl -lane '@F = split (); print join(" ",@F[0..9,22..26])' input_file > output_file