【问题标题】:Extracting columns from a file从文件中提取列
【发布时间】:2014-10-28 19:03:37
【问题描述】:

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

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) 的示例,但无法获得所需的输出。

【问题讨论】:

  • 输出中Header3000和Header200对应的列在哪里?是否有理由跳过它们?链接的问题似乎是完美的匹配,您能否更具体地说明您在使用那里提供的解决方案时遇到了什么问题?
  • 未跳过,这是一个错误。从链接的解决方案中,我只能得到所需输出的第一列。
  • 根据那里的答案包含您的尝试并解释您的问题中的问题是有用的。

标签: awk pattern-matching


【解决方案1】:

我会使用这样的小脚本:

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 

【讨论】:

    【解决方案2】:

    这条 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
    

    【讨论】:

    • 你能解释一下“a[$0]=7”吗?
    • @user2245731 与a[$0]=1 相同,后来我检查了if(a[$i]) 重要不为零。
    猜你喜欢
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多