如何将长字符串解释为 csv 格式?

How to interpret a long string into a csv format?

我有一个 mytext.txt 文件,其中包含以下内容:

2016-08-13 00:54:02,1471049642,62,28,16 2016-08-13 00:54:03,1471049643,62,28,20 2016-08-13 00:54:04,1471049644,62,28,18 2016-08-13 00:54:05,1471049645,62,28,18 2016-08-13 00:54:06,1471049646,62,28,19 2016-08-13 00:54:07,1471049647,62,28,17 2016-08-13 00:54:08,1471049648,62,28,19 2016-08-13 00:54:09,1471049649,62,28,16 2016-08-13 00:54:10,1471049650,62,28,19 2016-08-13 00:54:11,1471049651,62,28,18 

我尝试用 BASH 做一个 while 循环 :

while IFS="," read -r f1 f2 f3 f4 f5
do 
   echo -e "f1:$f1 f2:$f2 f3:$f3 f4:$f4 f5:$f5"
done < mytext.txt

得到以下输出:

2016-08-13 00:54:02,1471049642,62,28,16
2016-08-13 00:54:03,1471049643,62,28,20
2016-08-13 00:54:04,1471049644,62,28,18
2016-08-.....

但我得到的输出是:

f1:2016-08-13 00:54:02 f2:1471049642 f3:62 f4:28 f5:16 2016-08-13 00:54:03,1471049643,62,28,20  2016-08-13 00:54:04,1471049644,62,28,18 2016-08-....

其中 $f5 包含读取文件的其余部分。

我该如何补救?

您可以使用 sed 轻松处理此问题,方法是将日期前的 space 替换为换行符:

sed -E $'s/ ([0-9]{4}-[0-9]{2}-[0-9]{2} )/\\n\1/g' mytext.txt

使用 gnu sed:

sed -E 's/ ([0-9]{4}-[0-9]{2}-[0-9]{2} )/\n/g' mytext.txt

输出:

2016-08-13 00:54:02,1471049642,62,28,16
2016-08-13 00:54:03,1471049643,62,28,20
2016-08-13 00:54:04,1471049644,62,28,18
2016-08-13 00:54:05,1471049645,62,28,18
2016-08-13 00:54:06,1471049646,62,28,19
2016-08-13 00:54:07,1471049647,62,28,17
2016-08-13 00:54:08,1471049648,62,28,19
2016-08-13 00:54:09,1471049649,62,28,16
2016-08-13 00:54:10,1471049650,62,28,19
2016-08-13 00:54:11,1471049651,62,28,18