我有一个包含大表的文件,类似于:
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
我尝试了awk
(AWK extract columns from file based on header selected from 2nd file)的一些示例,但我无法获得所需的输出。
答案 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