web-dev-qa-db-fra.com

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
6
ASAD

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 (crédit de 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.strip().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 
7
Sergiy Kolodyazhnyy

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

Note: 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.

3
L. D. James