我有一个带有字段的TSV,如下所示:
name location 1,2,3,4,5当我使用sed 's/\w/,/g'时,我最终得到了csv,其中1、2、3、4和5被认为是独立的入口。我希望它是'1 2 3 4 5',在运行上面的命令之前,我已经尝试过将逗号转换为空格,使用以下命令
sed 's/,/\w/g' 但是,当将空格转换回逗号时,它包括单个空格和制表符,那么单个空格字符的正则表达式是什么呢?
所需输出:
name, location,1 2 3 4 5,发布于 2019-05-28 20:29:29
正如在注释中提到的,CSV通常通过将值括在引号中来处理其分隔符在值中的出现,因此我建议您只需将每个值括在引号中即可解决此问题:
sed -E 's/([^\t]*)(\t|$)/"\1",/g'你可以使用try it here。
这将在您的示例输出中留下一个尾随逗号,如果您想要避免它,您可以使用以下命令:
sed -E 's/\t+$//;s/^/"/;s/\t/","/g;s/$/"/'但是,如果您的原始数据包含",则需要对它们进行转义,您可以通过在其他数据之前添加以下替换来实现:
s/"/\\"/g正如Ed Morton建议的那样,我们还可以剥离尾随的空字段:
s/\t+$//总之,我将使用以下内容:
sed -E 's/"/\\"/g;s/\t+$//;s/^/"/;s/\t/","/g;s/$/"/'你可以试试here。
发布于 2019-05-28 20:33:08
将制表符替换为","并用双引号括起行,或者将逗号替换为空格,将制表符替换为逗号。在这两种情况下,您都将获得有效的CSV。
$ cat file
name location 1,2,3,4,5
$
$ sed 's/\t/","/g; s/^\|$/"/g' file
"name","location","1,2,3,4,5"
$
$ sed 's/,/ /g; s/\t/,/g' file
name,location,1 2 3 4 5发布于 2019-05-28 20:38:33
在awk中:
$ awk -v OFS="," '{for(i=1;i<=NF;i++)if($i~/,/)$i="\"" $i "\"";$1=$1}1' file
name,location,"1,2,3,4,5"解释:
$ awk -v OFS="," '{ # output delimiter to a comma *
for(i=1;i<=NF;i++) # loop all fields
if($i~/,/) # if comma in field
$i="\"" $i "\"" # surround with quotes **
$1=$1 # rebuild record
}1' file # output*如果记录中有空格,请考虑使用awk -F"\t"将字段分隔符输入到制表符。
**此外,如果字段中有带逗号的引号,则可能需要重复或转义它们。
https://stackoverflow.com/questions/56342068
复制相似问题