【发布时间】:2021-02-03 18:21:18
【问题描述】:
我有一个很大的CSV 文件,我需要根据其中一列中的值将其切成不同的部分。我的输入文件dataset.csv 是这样的:
注意:已编辑以澄清数据是 ,data, 没有空格。
action,action_type, Result
up,1,stringA
down,1,strinB
left,2,stringC
所以,用action_type 分割我只是这样做(我需要结果文件中的整个匹配行):
awk -F, '$2 ~ /^1$/ {print}' dataset.csv >> 1_dataset.csv
awk -F, '$2 ~ /^2$/ {print}' dataset.csv >> 2_dataset.csv
这按预期工作,但我基本上遍历了我的原始数据集两次。我的原始数据集大约 5GB,我有 30 个action_type 类别。我每天都需要这样做,所以我需要编写脚本让它自己高效地运行。
我尝试了以下方法,但它不起作用:
# This is a file called myFilter.awk
{
action_type=$2;
if (action_type=="1") print $0 >> 1_dataset.csv;
else if (action_type=="2") print $0 >> 2_dataset.csv;
}
然后我运行它:
awk -f myFilter.awk dataset.csv
但我什么也得不到。从字面上看,什么都没有,甚至没有错误。哪一种告诉我我的代码根本不匹配任何东西,或者我的打印/管道语句是错误的。
【问题讨论】:
-
您的字段分隔符是一个
,还是一个,后跟一个空格? -
@Cyrus,这是一个
,。谢谢! -
@markp-fuso,它没有空格。我只是编辑了问题以使其清楚。谢谢!
-
您希望标题行包含在每个输出文件中吗?你有 GNU awk (
awk --version) 吗?
标签: bash csv if-statement awk filter