使用 bash 格式化 .csv

Format .csv using bash

我在文本文件中有来自 Internet table 的数据。我需要将此文件转换为 .csv 标准(逗号分隔等)并清理它。例如:

Data    Fechamento  Variação    Variação (%)    Abertura    Máxima  Mínima  Volume
30 Abr 2020     2,00    0,76    61,29%  1,99    2,10    1,80    152.100
29 Abr 2020     1,24    -0,44   -26,19%     1,28    1,71    1,20    125.700

我的代码:

echo -e "File: \c"
read nome_arq

arq=$(<$nome_arq)

arq=$(echo $arq | sed 's/%//g')
arq=$(echo $arq | sed 's/()//g')
arq=$(echo $arq | sed 's/\.//g')
arq=$(echo $arq | sed 's/\+//g')
arq=$(echo $arq | sed 's/ Abr /_04_/g')
arq=$(echo $arq | sed 's/ Mar /\_03_/g')
arq=$(echo $arq | sed 's/\,/\./g')
arq=$(echo $arq | sed 's/\ /\,/g')

append="_clean"
echo -e $arq >> $nome_arq$append 

然而,输出中没有换行符,输出文件只有一行:

Data,Fechamento,Variação,Variação,Abertura,Máxima,Mínima,Volume,30_04_2020,2.00,0.76,61.29,1.99,2.10,1.80,152100,29_04_2020,1.24,-0.44,-26.19,1.28,1.71,1.20,125700,

我该怎么做才能在输出中保留原始换行符?

编辑 5 月 5 日:

我用下面的代码得到我的结果:

append="_clean"
cat $nome_arq|while read z;do echo "$z"|sed "s/\s\+/\"xxxx\"/g; s/^/\"/g; s/$/\"/g";done >> $nome_arq$append

sed 's/%//g' $nome_arq$append > output
rm $nome_arq$append
sed 's/()//g' output > output1
rm output
sed 's/\.//g' output1 > output2
rm output1
sed 's/\+//g' output2 > output3
rm output2
sed 's/\"//g' output3 > output4
rm output3
sed 's/xxxxMaixxxx/_05_/g' output4 > output5
rm output4
sed 's/xxxxAbrxxxx/\_04_/g' output5 > output6
rm output5
sed 's/xxxxMarxxxx/\_03_/g' output6 > output7
rm output6
sed 's/,/\./g' output7 > output8
rm output7
sed 's/xxxx/,/g' output8 > output9
rm output8

显然,它远未优化。例如,我不能使用 "tr" 命令。我怎样才能让我的剧本更精简?

编辑 5 月 13 日

修改后的最终代码:

echo -e "Arquivo nao-estruturado: \c"
read nome_arq

cp $nome_arq $nome_arq"_clean"
arq=$nome_arq"_clean"

sed -i 's/%//g;s/()//g;s/\.//g;s/\+//g;s/ Mai /_05_/g;s/ Abr /_04_/g;s/ Mar /\_03_/g;s/\,/\./g' $arq
sed -r -i  's/[[:space:]]+/,/g' $arq
sed -i 's/Data,Fechamento,Variação,Variação,Abertura,Máxima,Mínima,Volume/ref.date,price.close,var,var.perc,price.open,price.high,price.low,volume/g' $arq

试试这个:

cat your_input_File|while read z;do echo "$z"|sed "s/\s\+/\",\"/g; s/^/\"/g; s/$/\"/g";done

这将 return:

"Data","Fechamento","Variação","Variação","(%)","Abertura","Máxima","Mínima","Volume"
"30","Abr","2020","2,00","0,76","61,29%","1,99","2,10","1,80","152.100"
"29","Abr","2020","1,24","-0,44","-26,19%","1,28","1,71","1,20","125.700"

(已更新)

当你做最后的 echo 时,换行符会丢失。如果您不需要反斜杠序列的解释(您通过使用 echo -e 请求(并且 IMO 在您的情况下无论如何都没有意义,至少对于您的示例输入没有意义)),请执行

cat <<<"$arq" >> "$nome_arq$append" 

相反。

最终代码:

echo -e "Arquivo nao-estruturado: \c"
read nome_arq

cp $nome_arq $nome_arq"_clean"
arq=$nome_arq"_clean"

sed -i 's/%//g;s/()//g;s/\.//g;s/\+//g;s/ Mai /_05_/g;s/ Abr /_04_/g;s/ Mar /\_03_/g;s/\,/\./g' $arq
sed -r -i  's/[[:space:]]+/,/g' $arq
sed -i 's/Data,Fechamento,Variação,Variação,Abertura,Máxima,Mínima,Volume/ref.date,price.close,var,var.perc,price.open,price.high,price.low,volume/g' $arq