Wählen Sie Zeile und Element in awk aus

78

Ich habe gelernt, dass in awk $2die 2. Spalte ist. Wie gebe ich die i-te Zeile und das Element in der i-ten Zeile und der j-ten Spalte an?

Tim
quelle

Antworten:

164

So drucken Sie die zweite Zeile:

awk 'FNR == 2 {print}'

So drucken Sie das zweite Feld:

awk '{print $2}'

So drucken Sie das dritte Feld der fünften Zeile:

awk 'FNR == 5 {print $3}'

Hier ist ein Beispiel mit einer Kopfzeile und (redundanten) Feldbeschreibungen:

awk 'BEGIN {print "Name\t\tAge"}  FNR == 5 {print "Name: "$3"\tAge: "$2}'

Es gibt übrigens bessere Möglichkeiten, Spalten auszurichten als "\ t \ t".

Verwenden exitSie diese Option, um zu stoppen, sobald Sie den gewünschten Datensatz gedruckt haben, wenn kein Grund besteht, die gesamte Datei zu verarbeiten:

awk 'FNR == 2 {print; exit}'
Bis auf weiteres angehalten.
quelle
27

Um die Spalten mit einer bestimmten Zeichenfolge zu drucken, verwenden Sie das Suchmuster //. Wenn Sie beispielsweise nach zweiten Spalten suchen, die abc enthalten:

awk '$2 ~ /abc/'

... und wenn Sie nur eine bestimmte Spalte drucken möchten:

awk '$2 ~ /abc/ { print $3 }'

... und für eine bestimmte Zeilennummer:

awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
Hai Vu
quelle
24

Um Dennis 'Antwort zu erweitern, verwenden Sie awkdie -vOption, um die Werte iund jzu übergeben:

# print the j'th field of the i'th line
awk -v i=5 -v j=3 'FNR == i {print $j}'
Glenn Jackman
quelle
Können wir ein Beispiel dafür haben, wann die Verwendung der Option -v hilfreich wäre?
Rani Kheir
1
@dessert the jwird mit dem Wert ausgefüllt. 3Wenn dies der Fall print $jist, print $3wird die dritte Spalte gedruckt, sodass sie in ihrer jetzigen Form korrekt ist.
Davy M
1

Da awk und perl eng miteinander verbunden sind ...


Perl-Äquivalente der awk-Lösungen von @ Dennis:

So drucken Sie die zweite Zeile:
perl -ne 'print if $. == 2' file

So drucken Sie das zweite Feld:
perl -lane 'print $F[1]' file

So drucken Sie das dritte Feld der fünften Zeile:
perl -lane 'print $F[2] if $. == 5' file


Perl-Äquivalent zu @ Glenns Lösung:

Drucken Sie das j-te Feld der i-ten Zeile

perl -lanse 'print $F[$j-1] if $. == $i' -- -i=5 -j=3 file


Perl-Äquivalente der Lösungen von @ Hai:

Wenn Sie nach zweiten Spalten suchen, die abc enthalten:

perl -lane 'print if $F[1] =~ /abc/' foo

... und wenn Sie nur eine bestimmte Spalte drucken möchten:

perl -lane 'print $F[2] if $F[1] =~ /abc/' foo

... und für eine bestimmte Zeilennummer:

perl -lane 'print $F[2] if $F[1] =~ /abc/ && $. == 5' foo


-lEntfernt Zeilenumbrüche und fügt sie wieder hinzu, wenn beim Drucken
-adie Eingabezeile automatisch in ein Array aufgeteilt @Fwird. Dabei wird Leerzeichen als Trennzeichenschleife
-nüber jeder Zeile der Eingabedatei verwendet.
-eDer Code in Anführungszeichen
$F[1]ist das zweite Element des Arrays, da Perl bei 0
$.der Zeile beginnt Nummer

Chris Koknat
quelle