Ich habe gelernt, dass in awk $2
die 2. Spalte ist. Wie gebe ich die i-te Zeile und das Element in der i-ten Zeile und der j-ten Spalte an?
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 exit
Sie 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}'
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 }'
Um Dennis 'Antwort zu erweitern, verwenden Sie awk
die -v
Option, um die Werte i
und j
zu übergeben:
# print the j'th field of the i'th line
awk -v i=5 -v j=3 'FNR == i {print $j}'
j
wird mit dem Wert ausgefüllt.3
Wenn dies der Fallprint $j
ist,print $3
wird die dritte Spalte gedruckt, sodass sie in ihrer jetzigen Form korrekt ist.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
-l
Entfernt Zeilenumbrüche und fügt sie wieder hinzu, wenn beim Drucken-a
die Eingabezeile automatisch in ein Array aufgeteilt@F
wird. Dabei wird Leerzeichen als Trennzeichenschleife-n
über jeder Zeile der Eingabedatei verwendet.-e
Der Code in Anführungszeichen$F[1]
ist das zweite Element des Arrays, da Perl bei0
$.
der Zeile beginnt Nummerquelle