Unix 处理以管道分隔的平面文件时出现问题,每个字段用双引号括起来。这里有什么解决办法

Unix 处理以管道分隔的平面文件时出现问题,每个字段用双引号括起来。这里有什么解决办法,unix,awk,ksh,gawk,Unix,Awk,Ksh,Gawk,我必须处理管道分隔的平面文件,其中每个字段都包含双引号 样本数据: "1193919"|"false"|""|"Mr. Andrew Christopher Alman"|""|""|"Mr." 我已经在脚本中编写了许多gawk命令。现在的问题是: 问题: 考虑这行:“1193919”假Andrew Christopher Alman先生“”“先生”< /代码> 我的脚本将上述内容作为6个不同的字段 "1193919 false [null] Mr. Andrew Christopher Al

我必须处理管道分隔的平面文件,其中每个字段都包含双引号

样本数据:

"1193919"|"false"|""|"Mr. Andrew Christopher Alman"|""|""|"Mr."
我已经在脚本中编写了许多gawk命令。现在的问题是:

问题: 考虑这行:<代码>“1193919”假Andrew Christopher Alman先生“”“先生”< /代码> 我的脚本将上述内容作为6个不同的字段

"1193919
false
[null]
Mr. Andrew Christopher Alman"
[null]
"Mr."
但是发送数据文件的目的是
“1193919 | false | |安德鲁·克里斯托弗·阿尔曼先生”
应作为一个字段,并用双引号括起来

我的想法:我正在考虑将字段分隔符
从|改为“|”
这没有什么问题。最后和第一个字段将显示为
“1193919
Mr.”
我不想使用“
[”][|][“]| ^[“]|[“]$”
作为字段分隔符,因为这将增加字段的数量,我的其他代码将不得不进行重大更改

我在寻求一个类似以下的解决方案: 仅当|后跟“且后跟”时,才将其用作字段分隔符。但字段分隔符将是|而不是“|”

问题2:

"1193919""|"false"""|""|"Mr. Andrew Christopher Alman"
同时,我想报告一个错误,例如
“false”“
,类似于
/^”[“]+|[“]+[“]$/”而不是/^“$/
好的数据应采用以下格式

"1193919"|"false"|""|"Mr. Andrew Christopher Alman"

您可以使用
gawk
FPAT
变量定义带引号的字段

$ gawk -v FPAT='[^|]*|"[^"]*"' '{print $1}'

并围绕字段数等添加您的逻辑。

主要思想是在
awk
之前处理所有不规则情况(因为许多不规则情况都是可能的,
awk
对常规文件最有效)

您可以使用字段中不存在的唯一符号替换特定模式,然后将其用作字段分隔符:

sed 's/"|"/"\t"/g' file.txt |\
awk -F '\t' '{for(i = 1; i <= NF; i++){print i, $i} }'

下面是很好的解决方案,但为什么要在字段中嵌入字段删除器来发送数据呢。使用不在数据中的FS值将是解决此问题的另一个解决方案。祝你好运。有时候你只是以这种方式拥有数据,一个数据字段可能只是有一个分隔符作为数据,你只需要处理它。我写这个脚本是为了处理大量数据(对于数据仓库)。我期待各种各样的数据。对问题2的解决方案有什么想法吗?谢谢。但是,正如我在问题中提到的,我如何克服问题2?以下伪代码的实际语法是什么/^“[”]+|[”]+[“]$/而不是/^”“$/您能解释一下您的解决方案吗?我的理解是,数据字段不能是“|”,也不能是“在双引号内”。但我想写的数据字段也可以是“|”,如果在双引号内。我希望“|”不应被视为特殊字符(字段分隔符)当在双引号内时,我现在明白了解决方案。但是我的系统中没有带gawk的FPAT选项。有其他选择吗?谢谢Andrey。但是我写这篇文章是为了处理数据仓库的大量数据,我不知道,数据字段中不会有什么。以及我在问题中提到的问题2的想法。谢谢你,谢谢你知道文本中不太可能出现的其他字符是什么吗?这取决于数据。如果你的环境支持Unicode,你可以使用非字符,例如尝试
echo-e'a\uffffb'| awk-F“$(echo-e”\uffff”)“{for(i=1;i
sed 's/\([^|"]\)"\+|/\1"|/g'