处理管道分隔的平面文件时出现问题,每个字段都在双引号内。这里有什么解决方案

Issue in handling pipe delimited flat files,each field within double quotes. What can be a solution here

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

示例数据:

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

我在我的脚本中写了很多 gawk 命令。现在的问题是:

问题: 考虑这一行:"1193919|false||Mr. Andrew Christopher Alman"|""|"Mr." 我的脚本将以上内容作为 6 个不同的字段

"1193919
false
[null]
Mr. Andrew Christopher Alman"
[null]
"Mr."

但是发送数据文件的目的是 "1193919|false||Mr. Andrew Christopher Alman" 应该作为一个字段,用双引号括起来。

我的想法:我在考虑更改字段分隔符from | to "|" 这几乎没有问题。最后一个和第一个字段将作为 "1193919Mr." 我不想使用 '["][|]["]|^["]|["]$' 作为字段分隔符,因为这会增加数字字段,我的其他代码将不得不进行重大更改。

我要求的解决方案类似于: 使用 |仅当其后跟“且前导”时才作为字段分隔符。但是字段分隔符将是 |而不是“|”

问题 2:

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

同时我想报错"false""",类似/^"["]+ | ["]+["]$/ and not /^""$/ 好的数据应该是下面的格式

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

您可以使用 gawkFPAT 变量来定义带引号的字段

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

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

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

您可以用字段中未出现的唯一符号替换特定模式,然后将其用作字段分隔符:

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

我会使用文本中极不可能出现的内容,例如垂直制表符 \v。如果您不确定字段的内容,那么您可以确定一个不存在于当前数据块中的符号,并以该符号作为分隔符进行处理。

同样的方法适用于问题 2。如果您知道某些模式不正确,那么您可以在处理之前排除或修复它们,例如与

sed 's/\([^|"]\)"\+|/"|/g'