regex - awk/sed 帮助 - 如何查找包含逗号然后用双引号引起来的列?

标签 regex perl unix awk sed

我搜索了文件,但找不到这个特定的问题,并且在拼凑 awk 部分以得出答案时遇到困难。我有一个 Unix 文件,其中有大约十二个由管道分隔的列。我想获取这个分隔文件,将其转换为 .csv 并自动将其邮寄给员工以在 Excel 中打开。我的问题是某些列内部有逗号(例如:|RYAN, NOLAN|,这使得转换为 .csv 出现问题。

有谁知道 awk/sed/perl 中的一种方法可以找到存在逗号的列(单行中可能有多个实例)并用双引号将每个列括起来,这将允许 Excel正确打开单个列?

前数据集:

MSH|^~\&|IMT7||EXSCH|384^SCH|20150202082830||MFN^M02|RYAN, NOLAN|P|2.2|Last|First|DOE, JOHN|...

我希望上面的内容变成:

MSH|^~\&|IMT7||EXSCH|384^SCH|20150202082830||MFN^M02|"RYAN, NOLAN"|P|2.2|Last|First|"DOE, JOHN"|...

先谢谢各位高手了! 戴夫

最佳答案

使用 awk

awk -F '|' -v OFS='|' '{for(i=1;i<=NF;++i){if($i~/,/){$i="\""$i"\""}};print}' file

示例

echo "MSH|^~\&|IMT7||EXSCH|384^SCH|20150202082830||MFN^M02|RYAN, NOLAN|P|2.2|Last|First|DOE, JOHN|..."|awk -F '|' -v OFS='|' '{for(i=1;i<=NF;++i){if($i~/,/){$i="\""$i"\""}};print}'

结果

MSH|^~\&|IMT7||EXSCH|384^SCH|20150202082830||MFN^M02|"RYAN, NOLAN"|P|2.2|Last|First|"DOE, JOHN"|...

使用 sed 方法

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

关于regex - awk/sed 帮助 - 如何查找包含逗号然后用双引号引起来的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551617/

相关文章:

python - 用于匹配日期时间后跟空格和任何字符的正则表达式

html - 为什么 HTML::Obliterate 没有删除我的 HTML?

perl - perl 中的自定义数组排序

Perl Net::SSH2 公钥认证问题

bash - 我在 bash shell 脚本中写了这段代码,但有错误

Apachectl "service already loaded"当它不是

regex - 编号的正则表达式捕获的最大数量是多少?

c# - 使用 RegEx 替换无效字符

javascript - 正则表达式日期中的斜杠和反斜杠

c - Unix环境运行C程序