【问题标题】:extract columns from file based on list of header from 2nd file根据第二个文件的标题列表从文件中提取列
【发布时间】:2019-11-20 03:37:23
【问题描述】:

我有一个包含许多标题的大数据文件,文件以空格分隔(没有制表符或逗号)。我有另一个文本文件,其中包含所需标题的单列。标题包含数字和字母。我正在尝试使用 awk 提取这些标头并打印在新文件中 数据文件(all.cov):

FID IID 80.09   E45.32
1621    1621    0   0
1622    1622    1   0
1623    1623    0   0
1624    1624    0   1
1625    1625    0   0

头文件(all20.txt):

FID
IID
401.9
272.4
E45.32
80.09

我尝试了一些使用 awk 的互联网命令,但没有成功,如下所示。似乎程序正在运行,但没有打印任何内容:

awk -F' ' 'NR==FNR{arr[$1]++;next}{for(i=1; i<=NF; i++) if ($i in arr){a[i]++;}} { for (i in a) printf "%s[ ]", $i; printf "\n"}' all20.txt all.cov > test.txt

请帮忙!

【问题讨论】:

  • 请添加预期输出以便清晰的可视化。

标签: awk


【解决方案1】:

您能否尝试以下操作(仅使用提供的样本进行测试)。

awk '
FNR==NR{
  a[$0]
  next
}
FNR==1{
  for(i=1;i<=NF;i++){
    if($i in a){
       printf("%s%s",$i,i==NF?ORS:OFS)
       array[i]
    }
    else{
       if(i==NF){
         print ""
       }
    }
  }
  next
}
{
  for(j=1;j<=NF;j++){
    printf("%s%s",j in array?$j:"",j==NF?ORS:OFS)
  }
}
'  headers_file all.cov


代码逻辑解释:

  • 读取其中包含标题信息的 Input_file,将所有元素的信息保存到一个数组中。
  • 现在读取主 Input_file,在 Input_file 中为 Very第一行添加特定条件。
  • 循环遍历所有元素(在标题/第 1 行中)并继续检查数组中存在的任何元素(在读取标题文件/第 1 步时生成)。
  • 无论哪个元素存在于数组中,现在将其索引(FIELD NUMBER)放入新数组(随后将在所有其他行中使用)。
  • 使用 printf 命令 where put 1 条件来检查字段编号是否存在于数组中(在前一行中创建)然后打印它否则离开它。

【讨论】:

  • 谢谢...它似乎正在工作并添加数据,但是当我打开结果文件时它是空的,但它显示大小
  • 你也可以在一行中完成(我遇到语法错误),谢谢
  • @motor30,从技术上讲,这是一个外壳单线。另请注意文件名与您的不同。
  • 是的,我改变了这些并尝试在最后一行的结果文件中打印它:headers_file all.cov > result.txt 所以结果是空的,但它有一个很大的尺寸!
  • 在我将文件更改为dos2unix后,它现在可以工作了,但是结果文件的列之间的空间不相等...你能再看看并修改公式吗?谢谢
【解决方案2】:

与@RavinderSingh13 的概念类似,但更简单:

awk '
    NR == FNR { header[$0]=1; next }
    FNR == 1 {
        for (i=1; i<=NF; i++) if ($i in header) wanted[i]=1
    }
    {
        for (i=1; i<=NF; i++) if (i in wanted) printf "%s ", $i
        print ""
    }
' all20.txt all.cov | column -t

如果不需要,请将管道移至column -t

【讨论】:

  • 谢谢,但它只给出空的结果文件:all20.txt all.cov |列 -t > result.txt
  • 确保您的 all20 文件没有 DOS 样式的行尾。尾随 \r 将确保 all.cov 中的 no headers 匹配。
猜你喜欢
  • 1970-01-01
  • 2018-09-15
  • 2018-08-09
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多