Мне нужен сценарий оболочки для преобразования файла CSV в файл с разделителями (|), сохраняя запятые внутри заключительных кавычек

Когда вы запускаете команду в bash , она запоминает местоположение этого исполняемого файла, поэтому ему не нужно каждый раз заново искать в ПУТЬ . Поэтому, если вы запустите исполняемый файл, а затем измените его местоположение, bash по-прежнему будет пытаться использовать старое местоположение. Вы должны подтвердить это с помощью hash -t pip3 , который покажет старое местоположение.

Если вы запустите hash -d pip3 , он скажет bash забыть старое местоположение и найти новое при следующей попытке.

1
07.12.2016, 19:41
3 ответа

(генерировать вывод) | sed -e 's / "," / | / g' -e 's / ^ "//' -e 's /" $ //'

или

sed -e 's / "," / | / g '-e' s / ^ "// '-e' s /" $ // '$ file

Для трех выражений:

  • -e' s / "," / | / g ' = заменить все разделители "," новым разделителем |

  • -e' s / ^ "// ' = удалить ведущий » mark

  • -e 's / "$ //' = удалить конечный конец строки " mark

Это сохранит любые кавычки, которые встречаются в title, если они не соответствуют начальному шаблону разделителя ","

6
27.01.2020, 23:16

Как насчет cat test.csv | sed 's / \ ", \" / | / g' | sed 's / \ "// g'

Предполагая, что данные в вашем файле такие же, как показано выше (я не принимаю во внимание угловые случаи). Но у меня все вышеперечисленное сработало.

1
27.01.2020, 23:16

Этот обрабатывает встроенные разделители строк:

$ cat /tmp/bla
"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","embedded\",delimiters\",","Y!##!"

sed -E 's / "(([^"] * (\\ ")?) *) ", / \ 1 | / g; s /" | (([^ "] * (\\")?) *) "/ \ 1 / g '

PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|embedded\",delimiters\",|Y!##!
0
27.01.2020, 23:16

Теги

Похожие вопросы