用awk在列上拆分csv文件

时间:2018-08-28 11:47:28

标签: csv awk sh

我有一个很大的csv文件,我想分割成较小的csv文件,我有一个可行的解决方案:

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

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

big.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"

different-type.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

哪个有效,但速度缓慢。

1 个答案:

答案 0 :(得分:0)

赞:

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

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

注意:您需要将\t用引号引起来,例如:-F'\t'