2013-04-09 133 views
3

我有一個包含許多列的文件。讓我們說「Employee_number」「Employee_name」「薪水」。我想通過全部或部分列名顯示列中的所有條目。例如,如果我的輸入「名稱」我想要打印所有員工姓名。有沒有可能用awk以簡單的方式做到這一點? 感謝在awk中按名稱搜索列

+0

如果有人說「列名匹配'員工'」,你想要一列還是兩列輸出? – 2013-04-09 19:22:05

回答

3

給出一個腳本getcol.awk如下:

BEGIN { 
    colname = ARGV[1] 
    ARGV[1] = "" 
    getline 
    for (i = 1; i <= NF; i++) { 
     if ($i ~ colname) { 
      break; 
     } 
    } 
    if (i > NF) exit 
} 

{print $i} 

...並輸入文件test.txt

apple banana candy deer elephant 
A B C D E 
A B C D E 
A B C D E 
A B C D E 
A B C D E 
A B C D E 
A B C D E 

...命令:

$ awk -f getcol.awk b <test.txt 

。 ..給出以下輸出:

B 
B 
B 
B 
B 
B 
B 

請注意,輸出文本不包含測試文件的第一行,該行被視爲標題。

+0

如果有多個匹配,那麼是否應該打印多個列? – Scrutinizer 2013-04-09 17:16:57

+0

@sudo_O:如果參數值和任何標題行之間沒有匹配,則執行'if(i> NF)exit'行。它導致程序的主體不被執行。否則,程序將打印出與文件中的行(除標題外)一樣多的空行。 – Simon 2013-04-09 18:52:12

+0

@Scrutinizer:OP詢問只打印與參數中的頭部匹配的列。該程序打印其頭部與參數相匹配但不是兩個或更多的第一列。爲多個匹配打印多列的修改很簡單。 – Simon 2013-04-09 18:55:56

2

簡單的一行就可以了:

$ cat file 
a b c 
1 2 3 
1 2 3 
1 2 3 

$ awk -v c="a" 'NR==1{for(i=1;i<=NF;i++)n=$i~c?i:n;next}n{print $n}' file 
1 
1 
1 

$ awk -v c="b" 'NR==1{for(i=1;i<=NF;i++)n=$i~c?i:n;next}n{print $n}' file 
2 
2 
2 

$ awk -v c="c" 'NR==1{for(i=1;i<=NF;i++)n=$i~c?i:n;next}n{print $n}' file 
3 
3 
3 

# no column d so no output 
$ awk -v c="d" 'NR==1{for(i=1;i<=NF;i++)n=$i~c?i:n;next}n{print $n}' file 

注:在您的要求,你要name匹配employee_name只是知道,如果你給employee你會得到最後一列匹配employee這是很容易但是改變了。

+1

嗨@sudo_O,應該是'print $ n',不是? – Scrutinizer 2013-04-09 17:13:37

+0

謝謝@Scrutinizer我應該使用一個更好的輸入文件,所以這不會有思想傾向。 – 2013-04-09 17:17:45