2015-08-26 4 views
0

Я работаю на CSV файл, как этотСЕПГ, AWK регулярное выражение для замены строки

"EF", "12345", "Test, String", "Xyz" и мне нужен выход в

"EF", "12345", "Test$$$ String", "Xyz" 

в основном мне нужно заменить запятую с $$$

+0

Что. Have.You.Try? –

+0

Iam сортирует огромный CSV-файл (~ 4 ГБ) на основе определенных столбцов. Файл CSV разделен запятой. Я намерен использовать unix 'sort', который быстрее, однако у меня есть несколько строк, которые содержат запятую (,) в значениях строк. Как я сортирую в таком случае, когда число столбцов будет увеличиваться, если (,) используется как разделитель. Пример: Здесь я хочу сортировать по 2 и 4 столбцам, но если я использую (,) как разделитель, я получу всего 5 столбцов в 1-й строке и 4 столбца во второй строке, что испортит сортировку. «wert», «DGC», «Xyt, temp», «3456» «wert», «ABC», «ppp», «1234» – jsphdnl

+0

устранить целый ряд проблем из вашей обработки данных и начать экспорт ваших данные с символом '|' в качестве разделителя. Удачи. – shellter

ответ

2

Вы можете попробовать что-то вроде этого:

, ([^"])

и заменить:

$$$ $1

Regex live here.


или даже это:

([^"]),

И заменить:

$1$$$

Regex live here.

+3

мои sed и awk не поддерживают lookahead/позади. твоя делает? – Kent

+0

Жизнь и учеба .. спасибо –

+0

@shellter. Я обновил ... ты видел? –

3

Вы можете использовать гну-AWK для этого:

awk 'BEGIN{OFS=", "; FPAT="\"[^\"]+\""} {sub(/,/, "$$$", $3)} 1' file 
"EF", "12345", "Test$$$ String", "Xyz" 
0
sed ':a 
    s/^\(\([[:blank:]]*"[^"]*",\)*[[:blank:]]*"[^",]*\),/\1\$\$\$/ 
    t a 
    ' YourFile 
  • POSIX версия
  • использовать рекурсивное удаление из ; внутри строки, ограниченной " (так не самый быстрый)
  • Предполагая, что существует n o экранированный " внутри струны (если в корпусе, необходимо немного адаптировать)
0

Он также работает с подполем.
AWK '{суб (/ Test, /, "Test $$$")} 1' файл
"EF", "12345", "Test $$$ String", "Xyz"

Смежные вопросы