web-dev-qa-db-fra.com

Utilisez awk pour rechercher la première occurrence de chaîne après un délimiteur

J'ai un tas de documents qui ont tous la ligne, Account number: 123456789 à divers endroits.

Ce que je dois faire, c'est pouvoir analyser les fichiers et trouver le numéro de compte lui-même. Donc, awk doit rechercher Account number: et renvoyer la chaîne immédiatement après.

Par exemple, si c'était:

Account number: 1234567

awk devrait retourner:

1234567

Une fois la première occurrence trouvée, elle peut cesser de chercher.

Mais je suis perplexe. Quelle est la bonne façon de faire cela en utilisant awk?

22
DrDavid

Une manière:

awk -F: '$1=="Account number"{print $2;exit;}' file

Je suppose que vous voulez arrêter le moment où vous trouvez la première occurrence dans le fichier. Si vous souhaitez rechercher des occurrences dans chaque ligne du fichier, supprimez simplement la variable exit.

35
Guru

Vous pouvez utiliser une if pour vérifier si $1 et $2 correspondent à "Compte" et à "numéro:" Si tel est le cas, imprimez $3:

> awk '{if ($1 == "Account" && $2 == "number:") {print $3; exit;}}' input.txt
6
user334856

Pour ces correspondances, je préfère utiliser grep avec look-behind:

grep -Po '(?<=Account number: )\d+' file

ou

grep -Po 'Account number: \K\d+' file

Ceci dit: affiche quelle que soit la séquence de chiffres (\d+) apparaissant après la chaîne Account number:.

Dans le second cas, \K efface la chaîne correspondante, afin qu'elle commence à imprimer après ce \K.


Voyez-le en action avec un fichier file:

Account number: 1234567
but then another Account number: 789
and that's all

Voyons à quoi ressemble la sortie:

$ grep -Po '(?<=Account number: )\d+' file
1234567
789
3
fedorqui

Vous pouvez également utiliser sed -n s///p:

sed -En 's/^Account number: (.+)/\1/p' *.txt | head -n1
0
Lri