我需要在逗号分隔值文件中删除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忽略双引号内的","?
这个问题的目的是提供一个规范的答案.
给定可能由Excel或其他具有嵌入换行符的工具生成的CSV,嵌入式双引号和空字段,如:
$ cat file.csv
"rec1, fld1",,"rec1"",""fld3.1
"",
fld3.2","rec1
fld4"
"rec2, fld1.1
fld1.2","rec2 fld2.1""fld2.2""fld2.3","",rec2 fld4
Run Code Online (Sandbox Code Playgroud)
使用awk识别单独记录和字段的最有效方法是什么:
Record 1:
$1=<rec1, fld1>
$2=<>
$3=<rec1","fld3.1
",
fld3.2>
$4=<rec1
fld4>
----
Record 2:
$1=<rec2, fld1.1
fld1.2>
$2=<rec2 fld2.1"fld2.2"fld2.3>
$3=<>
$4=<rec2 fld4>
----
Run Code Online (Sandbox Code Playgroud)
所以它可以在awk脚本的其余部分内部用作那些记录和字段.
有效的CSV将符合RFC 4180或可由MS-Excel生成.
解决方案必须允许记录结束只是LF(\n),这是UNIX文件的典型情况,而不是CRLF(\r\n),正如标准所要求的那样,Excel或其他Windows工具会生成.它还可以容忍与引用字段混合的未加引号的字段.它特别不需要容忍"使用前面的反斜杠转义s(即\"代替""),因为其他一些CSV格式允许 - 如果你有,那么添加一个gsub(/\\"/,"\"\"")前端将处理它并尝试在一个脚本中自动处理两个转义机制将使脚本不必要地脆弱和复杂.
你如何使用gawk解析CSV文件?简单设置FS=","是不够的,因为带有逗号的引用字段将被视为多个字段.
使用的示例FS=","不起作用:
文件内容:
one,two,"three, four",five
"six, seven",eight,"nine"
Run Code Online (Sandbox Code Playgroud)
gawk脚本:
BEGIN { FS="," }
{
for (i=1; i<=NF; i++) printf "field #%d: %s\n", i, $(i)
printf "---------------------------\n"
}
Run Code Online (Sandbox Code Playgroud)
输出不好:
field #1: one
field #2: two
field #3: "three
field #4: four"
field #5: five
---------------------------
field #1: "six
field #2: seven"
field #3: eight
field #4: "nine"
---------------------------
Run Code Online (Sandbox Code Playgroud)
期望的输出:
field #1: one
field #2: two
field #3: "three, four"
field #4: five
---------------------------
field #1: "six, seven"
field …Run Code Online (Sandbox Code Playgroud) 我正在创建一个bash脚本来从CSV文件生成一些输出(我有超过1000个条目,并不想手工做它...).
CSV文件的内容类似于:
Australian Capital Territory,AU-ACT,20034,AU,Australia
Piaui,BR-PI,20100,BR,Brazil
"Adygeya, Republic",RU-AD,21250,RU,Russian Federation
Run Code Online (Sandbox Code Playgroud)
我有一些代码可以使用逗号作为分隔符来分隔字段,但有些值实际上包含逗号,例如Adygeya, Republic.这些值用引号括起来表示其中的字符应该被视为字段的一部分,但我不知道如何解析它以将其考虑在内.
目前我有这个循环:
while IFS=, read province provinceCode criteriaId countryCode country
do
echo "[$province] [$provinceCode] [$criteriaId] [$countryCode] [$country]"
done < $input
Run Code Online (Sandbox Code Playgroud)
它为上面给出的样本数据生成此输出:
[Australian Capital Territory] [AU-ACT] [20034] [AU] [Australia]
[Piaui] [BR-PI] [20100] [BR] [Brazil]
["Adygeya] [ Republic"] [RU-AD] [21250] [RU,Russian Federation]
Run Code Online (Sandbox Code Playgroud)
如您所见,第三个条目的解析不正确.我希望它输出
[Adygeya Republic] [RU-AD] [21250] [RU] [Russian Federation]
Run Code Online (Sandbox Code Playgroud) 我在用
awk '{ printf "%s", $3 }'
Run Code Online (Sandbox Code Playgroud)
从空格分隔的行中提取一些字段.当我引用字段时,我得到部分结果.请问有谁提出解决方案吗?