使用 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
我在文本文件中有来自 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