从文件中提取列

时间:2014-10-28 10:27:07

标签: awk pattern-matching

我有一个包含大表的文件,类似于:

Header1    Header2    Header3 ... Header8031
Value1     Value2     Value3 .... Value8031
.
.
Value1     Value2     Value3 ...  Value8031

在另一个文件中,我有一个列表,其中包含上一个表的一些标题。

Header1
Header3000
Header5
Header200
Header10

我想仅为列表中的标题提取表中的信息。换句话说,获取与列表中的标题匹配的列。 [将列表与表格中的列ID匹配]

输出

Header1   Header3000 Header5 Header200   Header10
Value1    Value3000  Value5  Value200    Value10
Value1    Value3000  Value5  Value200    Value10

我尝试了awkAWK extract columns from file based on header selected from 2nd file)的一些示例,但我无法获得所需的输出。

2 个答案:

答案 0 :(得分:3)

我会使用这样的小脚本:

FNR==NR {a[$1]; next}
FNR==1 { for (i=1;i<=NF;i++) if ($i in a) b[i] }
{ for (i=1; i<=NF; i++) if (i in b) printf "%s%s", $i, FS
print ""
}

解释

  • 首先阅读第二个文件并存储列名称。
  • 然后阅读第一个文件。
    • 在第一行,存储我们要打印的列的列号。
    • 从那时起,打印所需的列号。

测试

$ cat f1
Header1    Header2    Header3 Header8031
Value1     Value2     Value3 Value8031
Value1     Value2     Value3 Value8031
$ cat f2
Header1
Header3000
Header5
Header200
Header10
Header3

测试:

$ awk -f a.awk f2 f1
Header1 Header3 
Value1 Value3 
Value1 Value3 

答案 1 :(得分:1)

这个awk系列适合你:

awk 'NR==FNR{a[$0]=7;next}FNR==1{for(i=1;i<=NF;i++)if(a[$i])c[++x]=i}
    {for(i=1;i<=x;i++)printf "%s%s", $(c[i]), (i==x?RS:FS)}' headerFile dataFile

用例子测试:

kent$  head col f
==> col <==
Header1
Header3
Header5

==> f <==
Header1   Header2   Header3   Header4   Header5  Header10
Value1    Value2    Value3    Value4    VAlue5   Value10
Value1    Value2    Value3    Value4    Value5   Value10

kent$  awk 'NR==FNR{a[$0]=7;next}FNR==1{for(i=1;i<=NF;i++)if(a[$i])c[++x]=i}
        {for(i=1;i<=x;i++)printf "%s%s", $(c[i]), (i==x?RS:FS)}' col f
Header1 Header3 Header5
Value1 Value3 VAlue5
Value1 Value3 Value5