2009-10-01 49 views

回答

104

要打印的第二行:

awk 'FNR == 2 {print}' 

要打印的第二個字段:

awk '{print $2}' 

要打印第五行的第三個字段:

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

編輯 :這是一個帶有標題行和(冗餘)字段說明的示例s:

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

順便提一下,有比「\ t \ t」更好的對齊列的方法。

+0

謝謝! 是否可以使用特定的字符串打印列? – Tim 2009-10-01 23:57:34

21

爲了擴大對丹尼斯的回答,請awk-v選項傳遞ij值:

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

我們可以舉一個使用-v選項的例子嗎? – 2017-01-23 18:28:36

+1

這裏是一個:http://stackoverflow.com/q/9418617/7552 – 2017-01-23 18:41:06

+1

@dessert'j'用值'3'填充,所以當它執行'print $ j'時,它正在執行'print $ 3'正在印刷第三欄,所以它是正確的。 – 2017-12-04 17:02:14

25

要在指定的字符串打印的列,您可以使用//搜索模式。例如,如果你正在尋找第二列包含ABC:

awk '$2 ~ /abc/' 

...如果你只想打印特定列:

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

...和特定行number:

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

感謝您使用「〜」 – 2015-01-27 10:19:33

0

由於awk和perl密切相關......


Perl的當量@丹尼斯的AWK的解決方案:

要打印的第二行:
perl -ne 'print if $. == 2' file

要打印的第二個字段:
perl -lane 'print $F[1]' file

要打印第三字段第五行:
perl -lane 'print $F[2] if $. == 5' file


的Perl相當於格倫的解決方案@:

打印的第j場第i行

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


@海解決方案的Perl的等價物:

如果您正在尋找包含abc的第二列:

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

...如果你只想打印特定列:

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

...並且對於特定的行號:

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


-l移除換行,並把它們背面打印
-a autosplits輸入線成陣列@F時,使用空白作爲分隔符
-n循環輸入文件
-e的每一行執行引號內的代碼
$F[1]是所述陣列的所述第二元件,因爲Perl開始於0
$.是行號

0

我發現這個工作命令

根@網關:/家庭/ sshuser#AWS EC2描述,實例--instance-IDS I-2db0459d | grep的 'STATE \ | TAG' | awk的 'FNR == 1 {打印$ 1}'

STATE