背景 - 我想从一个csv文件中提取特定的列。该csv文件以逗号分隔,使用双引号作为文本限定符(可选,但当字段包含特殊字符时,限定符将存在-请参见示例),并使用反斜杠作为转义字符。某些字段为空也是可能的。
示例输入和期望输出 - 例如,我只希望输出文件中有第1、3和4列。从csv文件提取的最终列应与原始文件的格式相匹配。不应删除转义字符或添加额外的引号等。
输入
"John \"Super\" Doe",25,"123 ABC Street",123-456-7890,"M",A
"Jane, Mary","",132 CBS Street,333-111-5332,"F",B
"Smith \"Jr.\", Jane",35,,555-876-1233,"F",
"Lee, Jack",22,123 Sesame St,"","M",D
期望的输出
"John \"Super\" Doe","123 ABC Street",123-456-7890
"Jane, Mary",132 CBS Street,333-111-5332
"Smith \"Jr.\", Jane",,555-876-1233
"Lee, Jack",123 Sesame St,""
初步脚本(awk) - 下面是我找到的一个初步脚本,它大部分情况下都有效,但我注意到它在某些特定情况下无法工作,可能还有其他我没有看到或想到的情况。
#!/usr/xpg4/bin/awk -f
BEGIN{ OFS = FS = "," }
/"/{
for(i=1;i<=NF;i++){
if($i ~ /^"[^"]+$/){
for(x=i+1;x<=NF;x++){
$i=$i","$x
if($i ~ /"+$/){
z = x - (i + 1) + 1
for(y=i+1;y<=NF;y++)
$y = $(y + z)
break
}
}
NF = NF - z
i=x
}
}
print $1,$3,$4
}
以上方法在遇到包含转义双引号和逗号的字段时,会出现解析错误并导致输出结果不正确。
问题/评论 - 我了解到awk不是解析csv文件的最佳选项,建议使用perl。然而,我完全不懂perl。我找到了一些perl脚本示例,但它们没有给出我想要的输出结果,而且我不知道如何轻松地编辑脚本以满足我的需求。
至于awk,我熟悉它并偶尔使用其基本功能,但我不了解一些高级功能,例如上面脚本中使用的某些命令。是否可以只使用awk来实现我的期望输出?如果可以,是否可以编辑上面的脚本以解决我遇到的问题?能否有人逐行解释一下脚本正在做什么?
感谢任何帮助!