如何根据列值将CSV文件拆分为多个文件

5

我可以翻译中文,这里有一份CSV文件的例子:

name1;1;11880
name2;1;260.483
name3;1;3355.82
name4;1;4179.48
name1;2;10740.4
name2;2;1868.69
name3;2;341.375
name4;2;4783.9

有可能会有更多或更少的行,我需要将它分成多个.dat文件,每个文件包含此文件第二列值相同的行。(然后我将为每个.dat文件制作条形图)对于此案例,应该是两个文件:

data1.dat 
name1;1;11880
name2;1;260.483
name3;1;3355.82
name4;1;4179.48

data2.dat
name1;2;10740.4
name2;2;1868.69
name3;2;341.375
name4;2;4783.9

有没有使用bash简单的方法来完成它?
2个回答

13
你可以使用 awk 命令生成一个仅包含第二列特定值的文件:
awk -F ';' '($2==1){print}' data.dat > data1.dat

只需更改$2==条件中的值。

或者,如果您想自动执行此操作,只需使用:

awk -F ';' '{print > ("data"$2".dat")}' data.dat

这将输出包含名称中第二列值的文件。


是否可以打印四舍五入的值而不是(例如,260而不是260.483)? - user3616643
您可以使用int()函数截断值,awk -F ';' '{print > "data"int($2)".dat"}' data.dat - Andrzej Pronobis
1
当然,您可以仅打印所选列(并截断它们),例如使用 print int($3) > .... - Andrzej Pronobis
1
我使用第二种形式时遇到了语法错误,我需要像这样编写它:awk -F ',' '{print > ("foo" $2 ".csv") }' - 请注意额外的括号。 - Mihai Târnovan

2

试试这个:

while IFS=";" read -r a b c; do echo "$a;$b;$c" >> data${b}.dat; done <file

有没有关于如何对多个字段进行操作的提示?比如说,我想对第二列和第三列执行相同的操作,而不仅仅是第二列? - khan
@khan:我建议提出一个新问题 - Cyrus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接