我有一个很大的“csv”文件(大约 4.5GB),我需要删除一些列,因为我不需要它们。对于 bash,我是一个完全的初学者,所以我可能做了一些根本性错误的事情,但我的脚本耗尽了我计算机上的所有 RAM,直到它变得无法使用。
#!/bin/bash
while IFS="," read -r col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
do
if [[ "$col6" = '0' ]]
then
continue
else
echo "$col1, $col2, $col6,"$'\r' >> cleaned.csv
fi
done < data.csv
我不太确定为什么 RAM 会在这里增长,因为我不知道我在哪里将一些东西保存到内存中,这些东西可能会变成 10+GB 大...另外,如果我将上面的代码更改为
#!/bin/bash
while IFS="," read -r col1 col2 col3 col4 col5 col6 col7 col8 col9 col10
do
echo "$col1, $col2, $col6,"$'\r' >> cleaned.csv
done < data.csv
一切都很顺利...
编辑: “csv”文件示例:
username,id,my_watched_episodes,my_start_date,my_finish_date,my_score,my_status,my_rewatching,my_rewatching_ep,my_last_updated,my_tags
karthiga,21,586,0000-00-00,0000-00-00,9,1,,0,1362307973,
karthiga,59,26,0000-00-00,0000-00-00,7,2,,0,1362923691,
karthiga,74,26,0000-00-00,0000-00-00,7,2,,0,1367081015,
karthiga,120,26,0000-00-00,0000-00-00,7,2,,0,1362308037,
karthiga,178,26,0000-00-00,0000-00-00,7,2,0,0,1364399953,
karthiga,210,161,0000-00-00,0000-00-00,7,2,,0,1362923826,
karthiga,232,70,0000-00-00,0000-00-00,6,2,,0,1362849882,
karthiga,233,78,0000-00-00,0000-00-00,6,2,,0,1362893384,
karthiga,249,167,0000-00-00,0000-00-00,8,2,,0,1363709086,
karthiga,269,366,0000-00-00,0000-00-00,10,2,,0,1362303563,
答案1
您似乎正在处理 CSV,使得没有字段包含逗号。假设这个文件可以接受,您可以awk
直接使用
awk -F, 'BEGIN { OFS=FS } !$6 { print $1, $2, $6 }' data.csv > cleaned.csv
如果您确实需要\r
作为行终止符(而不是\n
),请使用它
awk -F, '!$6 { printf "%s,%s,%s\r", $1, $2, $6 }' data.csv > cleaned.csv
答案2
改变:
if [[ "$col6" = '0' ]]
到
if [[ "$col6" == "0" ]]
以消除内存问题。