J'ai appris que dans awk, $ 2 est la deuxième colonne. Comment spécifier la ième ligne et l'élément à la ième ligne et à la jième colonne?
Pour imprimer la deuxième ligne:
awk 'FNR == 2 {print}'
Pour imprimer le deuxième champ:
awk '{print $2}'
Pour imprimer le troisième champ de la cinquième ligne:
awk 'FNR == 5 {print $3}'
Voici un exemple avec une ligne d’en-tête et des descriptions de champs (redondants):
awk 'BEGIN {print "Name\t\tAge"} FNR == 5 {print "Name: "$3"\tAge: "$2}'
Il existe de meilleures façons d’aligner les colonnes que "\ t\t" en passant.
Utilisez exit
pour arrêter dès que vous avez imprimé l'enregistrement souhaité s'il n'y a aucune raison de traiter le fichier entier:
awk 'FNR == 2 {print; exit}'
Pour imprimer les colonnes avec une chaîne spécifique, utilisez le // modèle de recherche. Par exemple, si vous recherchez des secondes colonnes contenant abc:
awk '$2 ~ /abc/'
... et si vous souhaitez imprimer uniquement une colonne particulière:
awk '$2 ~ /abc/ { print $3 }'
... et pour un numéro de ligne particulier:
awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
Pour développer la réponse de Dennis, utilisez l'option -v
de awk
pour passer les valeurs i
et j
:
# print the j'th field of the i'th line
awk -v i=5 -v j=3 'FNR == i {print $j}'
J'ai trouvé cette commande de travail
root @ gateway:/home/sshuser # aws ec2 decris-des-instances -instance-ids i-2db0459d | grep 'ETAT\| TAG' | awk 'FNR == 1 {print $ 1}'
ETAT
Puisque awk et Perl sont étroitement liés ...
Equivalents Perl des solutions awk de @ Dennis:
Pour imprimer la deuxième ligne:Perl -ne 'print if $. == 2' file
Pour imprimer le deuxième champ:Perl -lane 'print $F[1]' file
Pour imprimer le troisième champ de la cinquième ligne:Perl -lane 'print $F[2] if $. == 5' file
Equivalent Perl de la solution @ Glenn:
Imprimer le ième champ de la ième ligne
Perl -lanse 'print $F[$j-1] if $. == $i' -- -i=5 -j=3 file
Equivalents Perl des solutions @ Hai:
si vous recherchez des deuxièmes colonnes contenant abc:
Perl -lane 'print if $F[1] =~ /abc/' foo
... et si vous souhaitez imprimer uniquement une colonne particulière:
Perl -lane 'print $F[2] if $F[1] =~ /abc/' foo
... et pour un numéro de ligne particulier:
Perl -lane 'print $F[2] if $F[1] =~ /abc/ && $. == 5' foo
-l
supprime les nouvelles lignes et les rajoute lors de l'impression-a
divise automatiquement la ligne en entrée dans le tableau @F
, en utilisant un espace comme séparateur-n
boucle sur chaque ligne du fichier d'entrée-e
exécuter le code entre guillemets$F[1]
est le deuxième élément du tableau, puisque Perl commence à 0
$.
est le numéro de la ligne