处理管道分隔的平面文件时出现问题,每个字段都在双引号内。这里有什么解决方案
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 "|"
这几乎没有问题。最后一个和第一个字段将作为 "1193919
和 Mr."
我不想使用 '["][|]["]|^["]|["]$'
作为字段分隔符,因为这会增加数字字段,我的其他代码将不得不进行重大更改。
我要求的解决方案类似于:
使用 |仅当其后跟“且前导”时才作为字段分隔符。但是字段分隔符将是 |而不是“|”
问题 2:
"1193919""|"false"""|""|"Mr. Andrew Christopher Alman"
同时我想报错"false"""
,类似/^"["]+ | ["]+["]$/ and not /^""$/
好的数据应该是下面的格式
"1193919"|"false"|""|"Mr. Andrew Christopher Alman"
您可以使用 gawk
的 FPAT
变量来定义带引号的字段
$ 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'
我必须处理管道分隔的平面文件,其中每个字段都在双引号内。
示例数据:
"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 "|"
这几乎没有问题。最后一个和第一个字段将作为 "1193919
和 Mr."
我不想使用 '["][|]["]|^["]|["]$'
作为字段分隔符,因为这会增加数字字段,我的其他代码将不得不进行重大更改。
我要求的解决方案类似于: 使用 |仅当其后跟“且前导”时才作为字段分隔符。但是字段分隔符将是 |而不是“|”
问题 2:
"1193919""|"false"""|""|"Mr. Andrew Christopher Alman"
同时我想报错"false"""
,类似/^"["]+ | ["]+["]$/ and not /^""$/
好的数据应该是下面的格式
"1193919"|"false"|""|"Mr. Andrew Christopher Alman"
您可以使用 gawk
的 FPAT
变量来定义带引号的字段
$ 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'