在 bash 中将 CSV 输出为单个字符串,无需额外安装 [重复]
Posted
技术标签:
【中文标题】在 bash 中将 CSV 输出为单个字符串,无需额外安装 [重复]【英文标题】:Output CSV as a single string in bash without extra installations [duplicate] 【发布时间】:2020-03-18 15:41:18 【问题描述】:我有一个包含如下数据的 CSV 文件:
1, 2, 3
A, B, C
4, 5, 6
我试图在 bash 中将其输出为由换行符分隔的单个字符串,如下所示:
"1, 2, 3\nA, B, C\n4, 5, 6"
我尝试了很多方法,但都没有奏效。感谢您的帮助!
编辑:
根据提供的答案,因为我的代码的其他用户可能需要相同的转换,我无法保证他们的系统上有什么,仍然在寻找答案,无论我是否有:
-
GNU sed 已安装
Windows 行尾与否
已安装
dos2unix
【问题讨论】:
因为我什至无法回答自己的问题......这就是最终对我有用的方法:var=$(tr '\r\n' '\\n' < input.csv)
然后echo "$var:q" > output.txt
【参考方案1】:
Both 的these 问题采用完全相同的方法来完成此任务。
这应该只是将“,”换成文字“\n”的问题,你可以用\\n
来做
编辑:如果链接失效,则来自先前答案的相关解决方案如下。这个答案完全归功于Zsolt Botykai,我已针对您的特定用例进行了修改:
将此解决方案与 GNU sed 一起使用:
sed ':a;N;$!ba;s/\n/\\n/g' file
这将循环读取整个文件, 然后用空格替换换行符。
解释:
通过
:a
创建标签。 将当前行和下一行附加到模式中 空间通过N
。 如果我们在最后一行之前,跳转到创建的 label$!ba
($!
表示不要在最后一行做,因为应该有 最后一个换行符)。 最后替换替换每个换行符 在模式空间(即整个文件)上有一个空格。
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 很好,感谢您指出这一点@shalomb!我已经修改了我的答案,以包含所提供链接中答案的相关部分。 @DavidAllewell 不幸的是,这只是给了我与我最初拥有的表格完全相同的输出。 @Frankie 真的吗?我得到了要求的结果。你能显示一个终端输出吗?您使用的是什么版本的 Bash(我假设 Bash)。 CSV 文件中是否有回车符?【参考方案2】:我不确定您是想在 bash 中使用预期的输出,还是想在其他地方使用指定的输出。以下是两种情况的两个答案:
用\n
替换换行符并添加包围"
引号
在这种情况下,您的问题是重复的——至少是用文字 \n
s 替换换行符的部分。最简单的解决方案是
sed -z 's/\n/\\n/g;s/.*/"&"/' yourFile
前提是你有 GNU sed
。
如果您的文件以换行符结尾(就像文本文件通常那样),您的字符串也会:"1, 2, 3\nA, B, C\n4, 5, 6\n"
如果您不想要尾随 \n
,您可以在实际处理之前将其排除:
sed -z 's/\n$//;s/\n/\\n/g;s/.*/"&"/' yourFile
"1, 2, 3\nA, B, C\n4, 5, 6"
在单行 bash 字符串中编码多行文件
使用 bash 的内置 printf
和 %q
格式。来自help printpf
:
%q
以一种可以作为 shell 输入重用的方式引用参数
要将文件内容传递给 printf,请使用 subshell:
printf %q "$(< yourFile)"
这将使用 bash 的 C 字符串格式,因为 \n
在双引号 "..."
字符串中不被视为换行符:
$'1, 2, 3\nA, B, C\n4, 5, 6'
【讨论】:
不幸的是,第一个选项给了我sed: illegal option -- z
,第二个选项给了我1,2,3$'\r'$'\n'A,B,C$'\r'$'\n'4,5,6%
。对不起,我不太明白!
该错误表明您没有 GNU sed 而是另一个版本。第二个输出显示您的文件不使用 linux 行尾 \n
,但 windows 行尾 \r\n
。将文件转换为 linux 行结尾(使用 dos2unix
工具),然后使用标记的重复项将 \n
替换为 \\n
或使用 sed 's/\r/\\n/' yourFile | tr -d '\n'
。以上是关于在 bash 中将 CSV 输出为单个字符串,无需额外安装 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BASH 中将制表符分隔值 (TSV) 文件转换为逗号分隔值 (CSV) 文件?
在 Pentaho 中将批量 .xlsx 文件转换为 .csv (UTF-8)