web-dev-qa-db-fra.com

sélectionner une ligne et un élément dans awk

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?

52
Tim

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}'
124

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 }'
26
Hai Vu

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}'
22
glenn jackman

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

0
Mansur Ali

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 

0
Chris Koknat