2009-10-01 12 views

Odpowiedz

104

Aby wydrukować drugą linię:

awk 'FNR == 2 {print}' 

aby wydrukować drugą murawę:

awk '{print $2}' 

aby wydrukować trzecie pole piątego line:

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

Edytuj : Oto przykład z linią nagłówka i (redundantnym) opisem pola s:

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

Istnieją lepsze sposoby wyrównywania kolumn niż "\ t \ t" przy okazji.

+0

Dzięki! Czy można wydrukować kolumny z określonym ciągiem znaków? – Tim

21

Aby rozwinąć na odpowiedź Dennisa, użyj awk „s -v opcję, aby przekazać wartości i i j:

# print the j'th field of the i'th line 
awk -v i=5 -v j=3 'FNR == i {print $j}' 
+0

Czy mamy przykład, kiedy użycie opcji -v byłoby pomocne? –

+1

Oto jedno: http://stackoverflow.com/q/9418617/7552 –

+1

@dekład 'j' jest wypełniony wartością' 3', więc gdy wykona 'print $ j', robi' print $ 3' które drukuje trzecią kolumnę, więc jest poprawna w obecnej formie. –

25

Aby wydrukować kolumny z określonym ciągiem, użyć // wyszukiwania wzorca. Na przykład, jeśli szukasz używanych kolumn, które zawiera abc:

awk '$2 ~ /abc/' 

... a jeśli chcesz wydrukować tylko konkretny kolumna:

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

... i dla określonej linii numer:

awk '$2 ~ /abc/ && FNR == 5 { print $3 }' 
+0

Dzięki za pokazanie użycia "~" –

0

Ponieważ awk i perl są blisko spokrewnione ...


Perl równoważniki @ rozwiązań awk Dennisa:

aby wydrukować drugą linię:
perl -ne 'print if $. == 2' file

aby wydrukować drugą murawę:
perl -lane 'print $F[1]' file

Aby wydrukować trzeciego pola piątej linii:
perl -lane 'print $F[2] if $. == 5' file


Perl równoważnik @ roztworu Glenn to:

druku pole j'th z i'th linii

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


Perl równoważników @ rozwiązań Hai:

Jeśli szukasz drugiej kolumny zawierającej abc:

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

... a jeśli chcesz wydrukować tylko konkretny kolumna:

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

... i dla danej linii numer:

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


-l usuwa znaki nowej linii, i dodaje je z powrotem w przypadku drukowania
-a autosplits linię wejściową do tablicy @F, używając spacji jako separatora
-n pętlę nad każdym wierszu pliku wejściowego
-e wykonanie kodu w cudzysłowach
$F[1] jest drugi element tablicy, ponieważ Perl zaczyna się 0
$. jest numer linii

0

znalazłem tego polecenia roboczą

root @ bramy:/home/sshuser # AWS-EC2 opisują przypadki --instance-ID i-2db0459d | grep 'STAN \ | TAG' | awk 'FNR == 1 {print $ 1}'

STATE