这是一个awk替代方案。
假设引用的字符串格式正确,即始终具有起始和终止引号,并且在其他引号中没有引号,您可以通过gsub在每个其他字段上替换,为|.
带管道
以下是使用 抓取第 3 到 6、11 和 14-15 列时可能发生的情况的示例coreutils cut:
awk -F'"' -v OFS='' '
NF > 1 {
for(i=2; i<=NF; i+=2) {
gsub(",", "|", $i);
$i = FS $i FS; # reinsert the quotes
}
print
}'\
| cut -d , -f 3-6,11,14-15 \
| awk -F'"' -v OFS='' -e '
NF > 1 {
for(i=2; i<=NF; i+=2) {
gsub("\\|", ",", $i)
$i = FS $i FS; # reinsert the quotes
}
print
}'
请注意,还有一个额外的后处理步骤可以|将,.
完全在 awk
awk或者,您可以在范围规范方面失去一般性来完成整个事情。这里我们只抓取第 3 到 6 列:
提取.awk
BEGIN {
OFS = ""
start = 3
end = 6
}
{
for(i=2; i<=NF; i+=2) {
gsub(",", "|", $i)
$i = FS $i FS
}
split($0, record, ",")
for(i=start; i<=end-1; i++) {
gsub("\\|", ",", record[i])
printf("%s,", record[i])
}
gsub("\\|", ",", record[end])
printf("%s\n", record[end])
}