【问题标题】:How to extract columns from data and make new named files如何从数据中提取列并创建新的命名文件
【发布时间】:2019-08-12 14:49:41
【问题描述】:

我正在尝试从拥有超过 200 个标题(列)的数据集中提取特定列。我想在单独的文件中获取前 5 列(CHROM ... ALT),以及从 H001 到 H231 的列中的一列。我只给出了我的文件头的例子,因为有些数据非常大。最好,我希望生成的数据文件具有其列的名称,例如 H001.txt(即第 1 到第 5 列,加上仅 H001 列)。我是 bash 脚本的新手,对如何使用变量有点困惑。谢谢!

这些是我文件中的标题,为了清楚起见,可以删除任何数据。

CHROM  POS     ID      REF     ALT     QUAL    FILTER  INFO    FORMAT  H001    H002    H003    H004    H005  ... H231

我尝试过的代码只会复制整个数据集而不是每一列,我正在努力寻找一种在列之后命名文件的方法。

#!/bin/bash


headers=$(head -n 1 myData.txt)
for i in $(seq 10 231); do
awk '{ print $1, $2, $3, $4, $5, $i }' FS='\t' myData.txt > "$i".txt
done

我想要的输出应该是这样的:

文件 H001.txt

CHROM  POS     ID      REF     ALT H001

文件 H002.txt

CHROM  POS     ID      REF     ALT H002

以此类推每列到 H231。

【问题讨论】:

  • 请将该示例输入的所需输出(无描述)添加到您的问题(无评论)。
  • 将您的脚本粘贴到那里:shellcheck.net
  • 哇,太酷了!谢谢你给我看这个

标签: bash


【解决方案1】:

您想在 awk 中移动重定向。例如,

awk '{for(i=10;i<=231;i++) { file=sprintf("H%03d.txt", i); print $1, $2, $3, $4, $5, $i >> file; close file }}' myData.txt

请注意,如果您的列数过多,您将遇到打开文件数量的限制,因此我将在每次迭代时关闭文件。如果列数足够小,您可以省略close file 并使用print ... &gt; file

要在文件名中使用标题行中的值,您可以执行以下操作:

awk 'NR==1{ split($0, hdr) } 
    NR > 1 { for(i=9;i<=12;i++) 
        {print $1, $2, $3, $4, $5, $i >> hdr[i] } 
    }' myData.txt 

【讨论】:

  • 读取第一行获取标题名称,将它们存储在数组中。指定要打印的索引并使用存储的值创建文件名。
  • 你需要在 awk 中有数组。我会编辑答案。
  • 最后一件事!打印时,文件中的标题信息丢失。您知道如何打印保留该信息吗?如果不可能,这不是什么大不了的事。
  • 解析时打印标题。例如awk 'NR==1{ split($0, hdr); for(i=9;i&lt;=12;i++) print &gt;&gt; hdr[i] } ...
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多