基于bash中的两列拆分文件

时间:2014-07-17 05:41:14

标签: bash awk sed

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

    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

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

  

360.40

     

1200.00

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你没有标记perl,但这里有一个oneliner:

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