如何在列上grep? (垂直扫描而不是水平扫描)

时间:2016-09-07 20:58:16

标签: awk grep gawk

假设我有一系列没有特定顺序的值:

Metric1 Metric3 Metric4 Metric5  Metric9  Metric8
Value1  Value3  Value4  Value5  Value9  Value8

grep for Metric5并吐出该列的最佳方法是什么?

例如

grep Metric5 <file>

应该返回

Metric5
Value5

2 个答案:

答案 0 :(得分:2)

一般来说:

awk -v colNames="Metric5 Metric1 Metric9" '
BEGIN { split(colNames,tmp); for (i in tmp) tgts[tmp[i]] }
NR==1 {
    for (i=1; i<=NF; i++) {
        if ($i in tgts) {
            fldNrs[++numTgts] = i
        }
    }
}
{
    for (tgtNr=1; tgtNr<=numTgts; tgtNr++) {
        printf "%s%s", $(fldNrs[tgtNr]), (tgtNr<numTgts ? OFS : ORS)
    }
}
' file
Metric1 Metric5 Metric9
Value1 Value5 Value9

如果您只想选择1列,那么显然只需在-v作业

上列出1

答案 1 :(得分:0)

$ cat > foo.awk
{
    for(i=1;i<=NF;i++) {
        a[i][NR]=$i
        if(foo==$i) 
            it=i
} nr=NR
} END {
    if(it!="") 
        for(i=1;i<=nr;i++) 
            print a[it][i]
}
$ awk -v foo="Metric5" -f foo.awk foo
Metric5
Value5