如何使用 bash 脚本从数字字符串中删除逗号和空格

如何使用 bash 脚本从数字字符串中删除逗号和空格

各位,我问过这个问题5次在这里,并从超级用户那里收到了 5 个单独的代码,这些代码全部失败了。

问题:我将股票信息从 Yahoo Finance 的 API 带回到 txt 文件中。

问题是:从此类有逗号和空格在其中进行分隔简直是一场噩梦,因为在 Excel 中很难进行分隔。Excel 想要将 670,000,000 拆分为 3 个独立的值,并将其拆分到 3 个独立的列中,这简直是笑话。

我怎样才能让 670,000,000 看起来像 670000000。

谁能解答这个很多人都失败的难题。下面的这个脚本是最新失败的。

cd desktop/quoteUpdate
while true
do
 curl -o quotes.txt -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
echo UPDATED:
date
sleep 5
done

答案1

我想我已经为你找到解决方案了......

cd desktop/quoteUpdate
while true
do
  curl  -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"|sed -e 's/,/_/1' -e 's/,/_/1' -e's/\(.*\),/\1_/' -e 's/,//g' -e 's/_/,/g' > quotes.txt
  echo UPDATED:
    date
    sleep 5
  done
done

尝试一下... 您可以通过简单地将 > quotes.txt 更改为 >> quotes.txt 将数据附加到 quotes.txt 文件中

答案2

从我脑子里想到的丑陋的解决方案应该可以解决问题。用以下内容替换您的 sed 行:

awk 'BEGIN{FS="\"";OFS="\"";}{gsub(",","",$5);$5=","$5;print $0}' quotes.txt > UPDATED_quotes.txt

如果我找到更优雅的答案,我会更新这篇文章。

答案3

您从 Yahoo! 获取的数据是CSV 格式格式太复杂,bash(甚至 sed 或 awk)无法在一行中正确解析。(由于具备完整的图灵机功能,因此任何工具这样做的话,结果就不好看。)

上述脚本的直接问题是sed没有提供任何输入,因此脚本挂起(curl完成后),因为sed等待stdin。您可能希望将“quotes.txt”附加到sed当前的命令行:

sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' quotes.txt

但是,处理完这个问题后,你还是会不开心,因为 -commandsed不会解析 CSV 数据。你需要某种 CSV 处理工具——搜索为你最喜欢的脚本语言编写的 CSV 解析包。如果Tcl可进行 CSV 解析作为...的一部分, 例如。

最后,如果你真的不需要正确处理 CSV 的所有可能性,而只是确保第三列可以被 Excel 理解,你可以用类似下面的方法作弊:

curl -o - -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1" | \
    awk -F, '{
        sub("^ *", "", $3);  # Start with 3rd field by stripping leading spaces
        for (i = 4; i < NF; i++) # Append other fields to 3rd - but the last one
            $3 = $3 $i;
        print $1 "," $2 "," $3 "," $NF
    }'

上述调用将数据直接从curl发送到awk(绕过中间文件创建)。如果您需要文件中的数据(例如用于 Excel 加载),请将awk的最终输出重定向到其中:

.... awk ..... > quotes.csv

顺便说一句,此示例中没有特定于 bash 的内容——任何 shell 都可以。请注意,此awk脚本仅修改第三列(将后续“列”附加到它,除了最后一列——NF)。还请注意,如果其中一个公司名称中包含逗号,它将失败。如果这对您来说是一个问题,可以使用引号(“)而不是逗号来查找必须合并在一起的数字,从而避免这种情况……但最重要的是,再次使用您最喜欢的脚本语言的 CSV 感知扩展将数据视为正确的 CSV。

答案4

使用 perl 代替 sed

perl -pe 's/,(?=\d{3}(?![.]))//g'

将逗号(后跟三位数字,没有小数点)替换为任何内容。

哦,刚刚看到你还想修剪空格

perl -pe 's/,[ ]+/,/g;s/,(?=\d{3}(?![.]))//g'

 

这应该在框架中代替“sed”,例如

#!/bin/sh
while true
do
  clear
  date
  curl -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"|\
    perl -pe 's/,[ ]+/,/g;s/,(?=\d{3}(?![.]))//g'| tee quotes.csv
  cat quotes.csv| sed -e 's/,/\t/g'> quotes.xls
  sleep 5
done


您是否知道,如果 csv 文件内的逗号被制表符替换,且扩展名为“.xls”,则 Excel 将“按原样”打开该文件。

相关内容