【问题标题】:split one file into multiple files according to columns using bash cut or awk使用 bash cut 或 awk 根据列将一个文件拆分为多个文件
【发布时间】:2018-03-28 03:51:05
【问题描述】:

我有一个 2TB 的文本表格文件,由制表符分隔,一列进一步由“;”分隔。是的,它实际上是一个非常大的 vcf 文件。

使用制表符分隔符,我们有 8 列,并使用“;”分隔符,我们可以将第 8 列拆分为另外 12 列。

为了便于统计分析,我需要将文件拆分为 19 个文件,每个文件包含一列。最好我可以只浏览一次文件(因为文件很大,我有 100 个大文件,IO 成本非常高),然后将 19 列写入 19 个单独的文件。

基本上,我已经以一种有效的方式解决了这个问题

剪切 1-2 file.txt > column12.txt

但是要得到这19列,我需要遍历文件19次,效率不高。

我想知道是否有一种有效的方法可以遍历文件一次并将其写入 19 个文件?

非常感谢您的帮助。

文件示例如下

a b c d e f g;h;i;j;k
m n o p q l x;y;z;o;p
a b c d e f g;h;i;j;k
a b c d e f g;h;i;j;k

那么我想要文件包含

a
m
a
a

【问题讨论】:

  • StackOverflow 不是免费的编码服务。所以希望你try to solve your own problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 使用awk 应该很容易做到这一点。 print $1 >> file1; print $2 >> file2; ...
  • 始终在您的帖子中向我们展示示例并将它们也包装在代码标签中,以便我们轻松理解您的问题。
  • 感谢使用 awk 的唯一问题是它如何处理两个分隔符,如“tab”和“;”?
  • 感谢 James,您是如何做到让示例表像我编辑时一样的技巧?

标签: bash


【解决方案1】:

使用 awk:

awk -F '[\t;]' '{for(i=1; i<=NF; i++) print $i >> "column" i ".txt"}' file

使用制表符和分号作为字段分隔符。 NF 包含当前行中最后一列的编号。 $i 包含当前列的内容和i 当前列的编号。

这将创建 11 个文件。 column11.txt 包含:

ķ p ķ ķ

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2011-12-25
    相关资源
    最近更新 更多