Возможное альтернативное решение этой проблемы. Он работает путем поиска полей, которые начинаются или заканчиваются кавычками, а затем объединяются вместе. В конце он обновляет поля и NF, поэтому, если вы поместите больше паттернов после того, как происходит слияние, вы можете обрабатывать (новые) поля, используя все обычные функции awk.
Я думаю, что это использует только функции POSIX awk и не полагается на расширения gawk, но я не совсем уверен.
# This function joins the fields $start to $stop together with FS, shifting
# subsequent fields down and updating NF.
#
function merge_fields(start, stop) {
#printf "Merge fields $%d to $%d\n", start, stop;
if (start >= stop)
return;
merged = "";
for (i = start; i <= stop; i++) {
if (merged)
merged = merged OFS $i;
else
merged = $i;
}
$start = merged;
offs = stop - start;
for (i = start + 1; i <= NF; i++) {
#printf "$%d = $%d\n", i, i+offs;
$i = $(i + offs);
}
NF -= offs;
}
# Merge quoted fields together.
{
start = stop = 0;
for (i = 1; i <= NF; i++) {
if (match($i, /^"/))
start = i;
if (match($i, /"$/))
stop = i;
if (start && stop && stop > start) {
merge_fields(start, stop);
# Start again from the beginning.
i = 0;
start = stop = 0;
}
}
}
# This rule executes after the one above. It sees the fields after merging.
{
for (i = 1; i <= NF; i++) {
printf "Field %d: >>>%s<<<\n", i, $i;
}
}
На входном файле, как:
thing "more things" "thing" "more things and stuff"
он производит:
Field 1: >>>thing<<<
Field 2: >>>"more things"<<<
Field 3: >>>"thing"<<<
Field 4: >>>"more things and stuff"<<<
показать ваш формат входного файла .. и ваш желаемый результат! – ghostdog74