【问题标题】:Splitting csv-file with awk on column在列上使用 awk 拆分 csv 文件
【发布时间】:2019-02-03 01:00:38
【问题描述】:

我有一个大的 csv 文件,我想将它拆分成更小的 csv 文件,我有一个可行的解决方案:

awk -F\t '{print > $2}'  big.csv

但我的问题是我希望文件末尾有 .csv,而不仅仅是现在的列。有任何想法吗?

大.csv

"a name" "type" "some more info" "and a bit more"
"a other name" "differnt-type" "more" "and a bit more"
"last name" "type" "something" "and last more"

我想要的结果:

type.csv

"a name" "type" "some more info" "and a bit more"
"last name" "type" "something" "and last more"

不同类型的.csv

"a other name" "differnt-type" "more" "and a bit more"

现在文件将是类型和不同类型的文件,没有 .csv。

我也看过这样的解决方案:

tail -n +1 big.csv | while IFS=$'\t' read d1 d2 c
do
 echo $d1'\t'$d2'\t'$c >> ${d2}.csv
done

这很有效,但速度很慢。

【问题讨论】:

    标签: csv awk sh


    【解决方案1】:

    像这样:

    awk -F'\t' '{fname=$2".csv"; print > fname; close(fname)}' big.csv
    

    awk 将保持输出文件打开,直到您调用 close()awk 退出。显式调用close(fname) 确保即使$2 有许多不同的值(这会导致许多打开的文件),您也不会用完文件描述符

    注意:您需要将\t 括在引号中,例如:-F'\t'

    【讨论】:

    • -F\t 会起作用吗?不应该是-F'\t'吗? :)
    • 对,错过了。谢谢!
    • 谢谢!我跳过了 close(fname) 因为我知道它将有多少个文件并且不需要关闭,因为它不会超过 15-20,如果我没有,它将需要 >> 而不是 >只有在每次打开文件时都会自动输入最后一行。 :)
    • 可能是我错了。它实际上应该在没有引号的情况下工作。让我稍后再回复您。
    • @hek2mgl 我认为这很奇怪,不是吗? bash 删除反斜杠,只传递 -Ft 这将使 t 成为分隔符。简单测试:awk -F\t '{print $2}' <<< $'1\t2\t3'.
    猜你喜欢
    • 2013-03-04
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2019-05-20
    相关资源
    最近更新 更多