在awk中按名称搜索列

时间:2013-04-09 05:44:06

标签: shell unix awk

我有一个包含许多列的文件。让我们说“Employee_number”“Employee_name”“Salary”。我想通过提供全部或部分列名来显示列中的所有条目。例如,如果我输入“名称”,我希望打印所有员工姓名。是否可以使用awk以简单的方式执行此操作? 感谢

2 个答案:

答案 0 :(得分: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

请注意,输出文本不包含测试文件的第一行,该行被视为标题。

答案 1 :(得分: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

注意:根据您的要求,您希望nameemployee_name匹配,请注意,如果您提供employee,您将获得与employee匹配的最后一列,这很容易更改但是。