2013-03-11 16 views
18

Mam wiele dokumentów, które wszystkie mają linię, Account number: 123456789 w różnych lokalizacjach.Użyj awk, aby znaleźć pierwsze wystąpienie ciągu znaków po ograniczniku

Co muszę zrobić, to móc przeanalizować pliki i znaleźć sam numer konta. Tak więc, awk musi szukać Account number: i zwrócić ciąg bezpośrednio po.

Na przykład, jeśli było:

Account number: 1234567 

awk powinien zwrócić:

1234567 

Raz znalazł pierwsze wystąpienie może przestać patrzeć.

Ale jestem zakłopotany. Jak to zrobić, używając awk?

Odpowiedz

30

jeden sposób:

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

Zakładam, że chcesz, aby zatrzymać ten moment można znaleźć pierwsze wystąpienie w pliku. Jeśli chcesz znaleźć wystąpienia w każdym wierszu pliku, po prostu usuń exit.

5

Możesz użyć numeru if, aby sprawdzić, czy $1 i $2 są równe "Konto" i "numer:". Jeśli tak, następnie wydrukować $3:

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

Dokładnie tak, jak byłoby to zrobić? – DrDavid

+0

Przykład dodany .. –

+1

Dlaczego dodatkowe '{}'? Dlaczego nie po prostu "awk" 1 $ == "Konto" && 2 $ == "liczba:" {wydrukuj 3 USD; exit} 'input.txt'? – tianon

0

Można też użyć sed -n s///p:

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

do takich skojarzeń Wolę używając grep z look-tył:

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

lub

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

Ten mówi: print cokolwiek sekwencja cyfr (\d+) pojawiających się po ciągu znaków Account number:.

W drugim przypadku \K czyści dopasowany ciąg, aby rozpocząć drukowanie po takim \K.


zobaczyć go w akcji dany plik file:

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

Zobaczmy, jak wygląda wyjście:

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