Фон - Я хочу извлечь определенные столбцы из файла CSV. Файл csv разделен запятыми, использует двойные кавычки в качестве квалификатора текста (необязательно, но когда поле содержит специальные символы, квалификатор будет там - см. Пример) и использует обратную косую черту в качестве escape-символа. Некоторые поля также могут быть пустыми.
Пример ввода и желаемого вывода - Например, я хочу, чтобы только столбцы 1, 3 и 4 были в выходном файле. Окончательное извлечение столбцов из файла CSV должно соответствовать формату исходного файла. Не следует удалять escape-символы или добавлять дополнительные кавычки и т. Д.
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? Если это так, можно ли будет отредактировать скрипт выше, чтобы исправить проблему, с которой я столкнулся? Может кто-нибудь построчно объяснить, что именно делает скрипт?
Любая помощь будет оценена, спасибо!