큰 "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이 왜 커지고 있는지 잘 모르겠습니다. 10GB 이상 커질 수 있는 메모리에 일부 항목을 어디에 저장하는지 모르기 때문입니다. 또한 위 코드를 다음과 같이 변경하면
#!/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" ]]
메모리 문제를 제거합니다.