我需要在逗号分隔值文件中删除2列.请考虑csv文件中的以下行:
"abc@xyz.com,www.example.com",field2,field3,field4
"def@xyz.com",field2,field3,field4
Run Code Online (Sandbox Code Playgroud)
现在,我想要的结果是:
"abc@xyz.com,www.example.com",field4
"def@xyz.com",field4
Run Code Online (Sandbox Code Playgroud)
我使用以下命令:
awk 'BEGIN{FS=OFS=","}{print $1,$4}'
Run Code Online (Sandbox Code Playgroud)
但是引号内的嵌入式逗号会产生问题,以下是我得到的结果:
"abc@xyz.com,field3
"def@xyz.com",field4
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何让awk忽略双引号内的","?
Ed *_*ton 38
从GNU awk手册(http://www.gnu.org/software/gawk/manual/gawk.html#Splitting-By-Content):
$ awk -vFPAT='([^,]*)|("[^"]+")' -vOFS=, '{print $1,$4}' file
"abc@xyz.com,www.example.com",field4
"def@xyz.com",field4
Run Code Online (Sandbox Code Playgroud)
并看看使用awk有效解析CSV的最有效方法是什么?更常见地解析字段中包含换行符等的CSV.
4ae*_*1e1 10
这不是bash/awk解决方案,但我推荐CSVKit,可以安装pip install csvkit.它提供了一系列命令行工具,专门用于CSV,包括csvcut,它完全符合您的要求:
csvcut --columns=1,4 <<EOF
"abc@xyz.com,www.example.com",field2,field3,field4
"def@xyz.com",field2,field3,field4
EOF
Run Code Online (Sandbox Code Playgroud)
输出:
"abc@xyz.com,www.example.com",field4
def@xyz.com,field4
Run Code Online (Sandbox Code Playgroud)
它删除了不必要的引号,我认为这不应该是一个问题.
在RTD上阅读CSVKit的文档.ThoughtBot有一篇很好的小博客文章介绍了这个工具,这是我学习CSVKit的地方.