2013-04-09 97 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