gpt4 book ai didi

bash - ASCII 文件,如何处理带引号的字符串中的分隔符?

转载 作者:行者123 更新时间:2023-11-29 09:37:33 25 4
gpt4 key购买 nike

我有一个使用 , 作为分隔符的 ASCII 文件(例如 csv),但是这个字符也出现在带引号的字符串中:

3,       "hh,1,foo",            foo
"5,,,5", "1,2,3d,,,something ", foo2
test, "col3", foo3

为了避免这种歧义,我想用 ; 替换 , 分隔符。如何用命令行做到这一点? (在 Linux 下)。


更新/额外问题:

至少有两个选项使用 sedawk

我的额外问题是哪个最快?(这对于 csv 文件可能很重要)。

最佳答案

我认为您的要求是在 GNU Awk 中使用 FPAT 的完美用例,

通常,当使用 FS 时,gawk 将字段定义为出现在每个字段分隔符之间的记录部分。换句话说,FS 定义了字段不是什么,而不是字段是什么。但是,有时您真的想根据字段的性质来定义字段,而不是根据字段的性质来定义。

最臭名昭著的这种情况是所谓的逗号分隔值 (CSV) 数据。如果逗号只分隔数据,就不会有问题。当其中一个字段包含嵌入的逗号时,问题就来了。在这种情况下,大多数程序会将字段嵌入双引号中。

对于此处显示的 CSV 数据,每个字段要么是“不是逗号的任何内容”,要么是“双引号、不是双引号的任何内容和结束双引号”。如果写成正则表达式常量(参见 Regexp),我们将有 ([^,]+)|([[:space:]]*\"[^\"]+\") . 将其写成字符串需要我们转义双引号,导致:

FPAT = "([^,]+)|([[:space:]]*\"[^\"]+\")"

在您的文件上使用它在 ; 字符上输出 de-limit 文件 do

awk -v OFS=';' 'BEGIN{FPAT = "([^,]+)|([[:space:]]*\"[^\"]+\")"}{$1=$1}1' file

您还可以通过使用系统中设置的 locale 来加快速度。将区域设置强制设置为 C 将使您可以单独将字符与 ASCII 数据集匹配,而不是 UTF-8,将其作为本地传递给命令

LC_ALL=C awk -v OFS=';' 'BEGIN{FPAT = "([^,]+)|([[:space:]]*\"[^\"]+\")"}{$1=$1}1' file

由于 FPAT 涉及使用标准正则表达式解析器,因此它的执行速度可能比涉及非正则表达式替换的解析器慢。

关于bash - ASCII 文件,如何处理带引号的字符串中的分隔符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47281774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com