背景- 我想从 csv 文件中提取特定列。 csv 文件以逗号分隔,使用双引号作为文本限定符(可选,但当字段包含特殊字符时,限定符将在那里 - 请参阅示例),并使用反斜杠作为转义字符。某些字段也可能为空。
示例输入和所需输出- 例如,我只希望第 1、3 和 4 列出现在输出文件中。从 csv 文件中最终提取的列应与原始文件的格式匹配。不应删除转义字符或添加额外的引号等。
Input
"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 就可以实现我想要的输出吗?如果是这样,是否可以编辑上面的脚本来解决我遇到的问题?有人可以逐行解释一下脚本到底在做什么吗?
任何帮助将不胜感激,谢谢!