在 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 替换换行符并添加包围" 引号

在这种情况下,您的问题是重复的——至少是用文字 \ns 替换换行符的部分。最简单的解决方案是 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,请使用 subshel​​l:

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)

如何在 bash shell 中将一个字符串拆分为多个字符串,至少用一个空格分隔?

在 Python 中将 .csv 值作为单个列表导入

在 bash 脚本中将 SSH 输出捕获为变量

解析单个 CSV 字符串?