Comment imprimer les 5 derniers champs dans awk?

J’ai 10 champs et je veux commencer du champ 5 au champ 10 et ignorer les 5 premiers champs. Comment puis-je utiliser NF in awk pour le faire?

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 

Je veux montrer seulement:

 f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Vous devez parcourir les champs:

 bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Ou vous pouvez créer des champs égaux à Null:

 bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Vous pouvez également utiliser une sous-chaîne de la ligne entière pour imprimer tous les caractères à partir du début du champ 6 (à l'aide de l' adresse https://stackoverflow.com/a/12900372/3701431 ):

 bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

ou utilisez simplement la commande cut :

 bash-4.3$ cut -d " " -f6-10 input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Python peut le faire aussi:

 bash-4.3$ python -c 'import sys;fields=[" ".join(line.ssortingp().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Ou bien:

 $ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Ou avec Ruby:

 bash-4.3$ ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Bash + xargs peut le faire aussi, bien qu'un peu plus compliqué:

 bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=($@);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Il suffit de traiter les champs d’intérêt. Ce sera le dernier champ -4, le dernier champ -3, jusqu’au dernier champ actuel.

Lire un fichier avec ce contenu ( file.txt ):

 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 

Exécutez awk sur le fichier comme décrit ci-dessous. La ligne avec le signe $ est la commande. Les deux dernières lignes sont la sortie.

 $ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt f6 f7 f8 f9 f10 c6 c7 c8 c9 c10 

Remarque : comme Cyrus l’a souligné dans le commentaire, j’ai supprimé le script bash et n’ai laissé que l’instruction print pour la simplifier et la rendre plus rapide.