2013-03-11 13 views
18

Ho un sacco di documenti che hanno tutti la linea, Account number: 123456789 in varie posizioni.Utilizzare awk per trovare la prima occorrenza solo di stringa dopo un delimitatore

Quello che devo fare è essere in grado di analizzare i file e trovare il numero di conto stesso. Quindi, awk deve cercare Account number: e restituire la stringa immediatamente successiva.

Per esempio, se è stato:

Account number: 1234567 

awk dovrebbe restituire:

1234567 

Una volta che è trovata la prima occorrenza può smettere di guardare.

Ma, sono perplesso. Qual è il modo giusto per farlo usando awk?

risposta

30

Un modo:

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

Presumo che si desidera interrompere il momento in cui si trova la prima occorrenza del file. Se si desidera trovare occorrenze in ogni riga del file, è sufficiente rimuovere lo exit.

5

È possibile utilizzare un if per verificare se $1 e $2 uguale "Account" e "numero:". Se lo fanno, quindi stampare $3:

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

Esattamente come avrei dovuto farlo? – DrDavid

+0

Esempio aggiunto .. –

+1

Perché l'extra '{}'? Perché non solo "awk" $ 1 == "Account" && $ 2 == "numero:" {print $ 3; exit} 'input.txt'? – tianon

0

Si potrebbe anche usare sed -n s///p:

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

Per tali abbinamenti Io preferisco usare grep con sguardo-behind:

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

o

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

Questo dice: stampa qualunque sequenza di cifre (\d+) che appaiono dopo la stringa Account number:.

Nella seconda, \K cancella la stringa corrispondente, in modo che inizi a stampare dopo tale \K.


vederlo in azione dato un file di file:

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

Vediamo come l'output appare come:

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