awk или sed и т. д. замените запятую на |но где между кавычками - PullRequest
0 голосов
/ 30 ноября 2018

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

Я знаю, что могу заменить запятую, используя имя файла sed 's /, / | / g', но я не уверен, как получитьтекст между кавычками как исключение из правила, или, если возможно, это легко.

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Вы можете попробовать это sed:

sed ':A;s/\([^"]*"[^"]*"\)\([^"]*\)\(,\)/\1|/;tA' infile
0 голосов
/ 01 декабря 2018

Использование GNU awk, FPAT и файла примера @ Kubator:

$ awk '
BEGIN {
    FPAT="([^,]+)|( *\"[^\"]+\" *)"  # define the field pattern, notice the space before "
    OFS="|"                          # output file separator
}
{
    $1=$1                            # rebuild the record
}1' file                             # output
aaa|1|"what's up"
bbb|2|"this is pipe | in text"
ccc|3|"here is comma, in text"
ddd|4|  ",, here a,r,e multi, commas,, ,,"
"e,e"|5|first column
0 голосов
/ 30 ноября 2018

Как рекомендуют ребята, лучше и безопаснее читать csv как csv с соответствующим модулем / библиотекой.

В любом случае, если вы хотите посидеть здесь, это:

sed -i 's/|//g;y/,/|/;:r;s/\("[^"]*\)|\([^"]*"\)/\1,\2/g;tr' file.csv

Процедура:

  • Во-первых, он удаляет все каналы из CSV, чтобы не повредить CSV.
  • Во-вторых, он преобразует все запятые в каналы
  • В-третьих, он "рекурсивно" восстанавливает все каналы, указанные в кавычках, в запятые.

Тест:

$ cat file.csv
aaa,1,"what's up"
bbb,2,"this is pipe | in text"
ccc,3,"here is comma, in text"
ddd,4,  ",, here a,r,e multi, commas,, ,,"
"e,e",5,first column

$ cat file.csv | sed 's/|//g;y/,/|/;:r;s/\("[^"]*\)|\([^"]*"\)/\1,\2/g;tr'
aaa|1|"what's up"
bbb|2|"this is pipe  in text"
ccc|3|"here is comma, in text"
ddd|4|  ",, here a,r,e multi, commas,, ,,"
"e,e"|5|first column

$ cat file.csv | sed 's/|//g;y/,/|/;:r;s/\("[^"]*\)|\([^"]*"\)/\1,\2/g;tr' | awk -F'|' '{ print NF }'
3
3
3
3
3
...