【问题标题】:Split file based off of two columns in bash根据 bash 中的两列拆分文件
【发布时间】:2014-07-17 14:19:32
【问题描述】:

我有一个制表符分隔的文件,我想根据两列将其拆分为较小的文件。我的数据如下所示:

    360.40   hockey   james  april  expensive
    1200.00  hockey   james  may    expensive
    124.33   baseball liam   april  cheap
    443.12   soccer   john   may    moderate

我想按第三和第五列解析这些行。

最终结果将是三个不同的文件,以第三和第五列命名,如下所示:

james-expensive.tsv liam-cheap.tsv john-moderate.tsv

在每个文件中,我只想要与该名称/费用类型关联的行中的第一个值。因此,在 james-expensive.tsv 中,该文件将包含一列:

360.40

1200.00

我想也许某种 awk 脚本或 sed 脚本可以解决这个问题,但我不太确定从哪里开始。

如果使用 awk 或 sed 执行此操作似乎是个坏主意,那也有助于了解。

【问题讨论】:

    标签: bash awk sed


    【解决方案1】:

    使用awk

    awk '{ print $1 > $3 "-" $5 ".tsv" }' your_file
    

    结果:

    $ for F in *.tsv; do echo "---- $F ----"; cat "$F"; done
    ---- james-expensive.tsv ----
    360.40
    1200.00
    ---- john-moderate.tsv ----
    443.12
    ---- liam-cheap.tsv ----
    124.33
    

    nawk 的更新:

    awk '{ f = $3 "-" $5 ".tsv"; print $1 > f }' your_file
    

    防止打开文件过多:

    awk '{ f = $3 "-" $5 ".tsv" } !a[f]++ { printf "" > f } { print $1 >> f; close(f) }' your_file
    

    【讨论】:

    • 你知道 OS X awk 是否可以工作吗?得到这个awk: syntax error at source line 1 context is {print $1 > $3 >>> "-" <<< awk: illegal statement at source line 1 awk: illegal statement at source line 1
    • 当我运行上述 awk 命令时,出现以下错误:awk: syntax error at source line 1 context is {print $1 > $3 >>> "-" <<<
    • 您可能正在使用nawk。解决方法是先将文件名存储到变量中:awk '{f = $3 "-" $5 ".tsv"; print $1 > f}' your_file
    • 最后一个问题,可以使用的文件大小是否有限制?例如,我的文件会有几十万行。
    • @GrahamJackson 数据大小没有限制,但可能必须考虑目标文件的数量。如果数量多,则需要调整。如果显示错误,您可以在临时目录上测试它吗?
    【解决方案2】:

    你没有标记 perl,但这里是一个单行:

    perl -lane '`echo "$F[0]" >> $F[2]-$F[4].tsv`' file
    

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 1970-01-01
      • 2016-11-19
      • 2018-09-13
      • 1970-01-01
      • 2022-11-14
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多