首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >awk FPAT忽略csv中的逗号

awk FPAT忽略csv中的逗号
EN

Stack Overflow用户
提问于 2019-12-01 17:15:02
回答 1查看 312关注 0票数 1

Sample.csv数据

代码语言:javascript
复制
"2-Keyw-Bllist, TerrorViolencetest",vodka,ZETA+GLOBAL 4(ID: ZETA+GLOBAL),,105629,523,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,Captify (ID: Captify),,94676,884,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,QuantCast (ID: QuantCast),,46485,786,flag
TerrorViolencetest,germany,QuantCast (ID: QuantCast),,31054,491,flag
EY-Keyword-Blacklist,BBQ,MIQ+RON (ID: MIQ+RON),,26073,149,flag
TerrorViolencetest,chips,Captify (ID: Captify),,23737,553,flag
"2-Keyw-Bllist, TerrorViolencetest",bacon,QuantCast (ID: QuantCast),,17461,241,flag
VurityAdult-1test,cracks,Captify (ID: Captify),,17325,358,flag
VurityAdult-1test,pizza+grills,Captify (ID: Captify),,15173,41,flag

期望输出

代码语言:javascript
复制
"2-Keyw-Bllist, TerrorViolencetest",vodka,ZETA+GLOBAL (ID: ZETA+GLOBAL),105629,523,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,Captify (ID: Captify),94676,884,flag
"2-Keyw-Bllist, TerrorViolencetest",vodka,QuantCast (ID: QuantCast),46485,786,flag
TerrorViolencetest,germany,QuantCast (ID: QuantCast),31054,491,flag
EY-Keyword-Blacklist,BBQ,MIQ+RON (ID: MIQ+RON),26073,149,flag
TerrorViolencetest,chips,Captify (ID: Captify),23737,553,flag
"2-Keyw-Bllist, TerrorViolencetest",bacon,QuantCast (ID: QuantCast),17461,241,flag
VurityAdult-1test,cracks,Captify (ID: Captify),17325,358,flag
VurityAdult-1test,pizza+grills,Captify (ID: Captify),15173,41,flag

问题

我有7列数据,能够打印/删除所需的输出列(如果有效的话)。但是,由于第1列中数据中间的逗号很硬,awk认为我有超过7列,当我尝试删除第4列时,它不应该删除值,因为有些行被分流到不应该的列中。

我试过的

  • ,我已经尝试过从csvtool (它能够正确地确认列)的结果进行管道,并使用sed/awk来为其他事情划分逗号。我猜这是因为其他命令不理解csvtool对列的了解。
  • 我试过使用awk的FPAT,但是从我能够在线计算出的内容来看,我可以得到我想要的输出,但是我的脚本似乎只打印我的数据的最后一行。

awk -F"," -v OFS=',' 'BEGIN {FPAT = "([^,]*)|(\"[^\"]+\")"} END {print $1,$2,$3,$5,$6,$7}' sample.csv

有没有人知道在我删除列的时候,有更容易的方法让我的列被理解,或者FPAT是唯一能做到这一点的方法,而我所做的却遗漏了一些东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-01 17:19:16

你能试一下吗。

代码语言:javascript
复制
awk -F"," -v OFS=',' 'BEGIN{FPAT="([^,]*)|(\"[^\"]+\")"} {print $1,$2,$3,$5,$6,$7}' Input_file

或者更好地利用BEGIN :)

代码语言:javascript
复制
awk 'BEGIN{FS=OFS=",";FPAT="([^,]*)|(\"[^\"]+\")"} {print $1,$2,$3,$5,$6,$7}' Input_file

OP代码部分工作的原因:因为您使用END块并在那里打印所有东西,这就是它打印最后一行的原因(尽管很少的awk AFAIK没有定义这种行为)。END块是如何工作的:

awk__ 中有三个主要模块

  1. BEGIN块:在读取任何Input_file之前运行,当您想在程序开始读取实际的Input_file.
  2. {...}主块之前初始化变量时,这一点很重要:现在是主块,其中所有Input_file记录(行)都将是read.
  3. END块:任何awk程序的END块都是在读取整个Input_file的程序完成后执行的,所以所有类型的计算(例如->使用数组),在处理完Input_file后打印最后一个值将在这里完成。

man awk 所说的:

最后,在所有输入用完后,gawk将执行结束规则(如果有的话)中的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59127981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档