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 (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
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.