Использование SED для замены начальных и конечных интервалов в CSV-файле - PullRequest
0 голосов
/ 02 января 2019

Я использую следующую команду для удаления начальных и конечных пробелов из файла A.csv

sed "s/^  \+//g;s/[ \t]*$//;s/ \{1,\}/ /g" <A.csv> B.csv

Вот пример для A.csv

"a","  v b","z"
"a","   vd","z"
"a","  v, b, c ","z  "
"a","  vb ","z   "

Проблема заключается вчто не все начальные и конечные пробелы удалены, как показано ниже:

"a"," v b","z"
"a"," vd","z"
"a"," v, b, c ","z "
"a"," vb ","z "

Ниже приведен пример того, что я ожидал:

"a","v b","z"
"a","vd","z"
"a","v, b, c","z"
"a","vb","z"

Как я могу получить это право?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Вы не можете / не должны делать это правильно только с sed. Я рекомендую перейти на лучший язык, который может работать с файлами CSV.

Существует также инструмент под названием csvtool:

$ cat /path/to/trim
#!/usr/bin/env bash
shopt -s extglob
for c; do
    c=${c##*([[:space:]])} c=${c%%*([[:space:]])}
    printf '"%s"\n' "${c//'"'/'""'}"
done | paste -sd,

$ csvtool call /path/to/trim A.csv
"a","v b","z"
"a","vd","z"
"a","v, b, c","z"
"a","vb","z"

Насколько мне нравится csvtool для простых вещей, это, к сожалению, будет мучительно медленным! Моему VBox потребовалось почти 15 секунд, чтобы обработать короткую 4000-строчную CSV.

0 голосов
/ 03 января 2019

Это может сработать для вас (GNU sed):

sed -r 's/"\s*([^[:space:]"]+(\s*[^[:space:]"]+)*)\s*"/"\1"/g' file

Удалять немедленные пробелы с обеих сторон пары двойных кавычек, глобально по всему файлу.

0 голосов
/ 02 января 2019
sed 's/" \+/"/g;s/[ \t]*"/"/g;s/ \{1,\}/ /g' A.csv

Выход:

"a","v b","z"
"a","vd","z"
"a","v, b, c","z"
"a","vb","z"

Ваша собственная команда, работает только s/ \{1,\}/ /g.
Дело в том, что sed будет обрабатывать CSV-файл как простой текстовый файл без запятых.и кавычки для столбцов.
Так что ^ и $ будут соответствовать только началу и концу каждой строки.
Также вы забыли поставить g во вторую s.

...