Как префикс значений столбца с апострофом (')?

У меня есть CSV-файл с несколькими столбцами и 1000-ыми записями, мне нужно префикс всех значений одного из столбцов (скажем, 2-й столбец) с апострофом ' кроме первой строки или строки заголовка». Возможно, будет простой лайнер для этого. Как я могу достичь этого с помощью awk или sed ? Обратите внимание: я могу иметь несколько запятых в значениях, заключенных в двойные кавычки.

Пример данных:

 "col1","col2","col3","col4","col5" "value11","value12","value13","value14","value15" "value21","value22","value23","value24","value25" "value31","value32","value33","value34","value35" 

Ожидаемый результат:

 "col1","col2","col3","col4","col5" "value11","'value12","value13","value14","value15" "value21","'value22","value23","value24","value25" "value31","'value32","value33","value34","value35" 

4 Solutions collect form web for “Как префикс значений столбца с апострофом (')?”

СЭД:

 sed '2,$s/^\("[^"]*","\)/\1'"'"/ test.in 

Использование ERE для устранения некоторых из них:

 sed -E '2,$s/^("[^"]*",")/\1'"'"/ test.in 

AWK:

 awk -F, 'NR>1{sub(/^"/,"\"'"'"'",$2)}1' test.in 

Если вы не хотите беспокоиться о цитировании, используйте escape-код:

 awk -F, '{sub(/^"/,"\"\x27",$2)}1' test.in 

Использование Perl:

 perl -pi -e ' BEGIN{ $column_number = 2; # Change as needed $column_number--; $apostrophe = chr 39; } next unless $this_is_data++; # Skip the first line s@ ^((?:"[^"]+"\s*,){$column_number}) "@$1"$apostrophe@x ' your_file 

Это предполагает, что ваши поля не содержат котировки с обратным слэшем.

Вот такой gawk:

 $ gawk -F'","' -v var="'" -v OFS='","' 'NR>1{$2=var$2;} 1' foo.csv 

Параметр -v позволяет вам определять переменные, доступные для скрипта gawk . В этом случае var is ' и OFS (разделитель выходного поля) является "," , как и разделитель полей ввода ( -F ). Затем мы проверяем, что это не первая строка ( NR>1 ) и добавьте значение var во второй столбец. Наконец, 1 – всего лишь трюк, он оценивает значение true, которое заставляет gawk печатать линию. Это эквивалентно добавлению print; но короче.

Если вы хотите запустить это в другом столбце, просто измените $2=var$2; до $N=var$N где N – номер столбца, который вас интересует.


Вы также можете сделать это в perl (естественно, вы можете делать все в perl):

 $ perl -F'\",\"' -ane '$.>1 && do{$F[1]=chr(39).$F[1]}; print join("\",\"",@F)' foo.csv 

Переключатель -a делает perl-разделенные входные строки похожими на gawk только тем, что он сохраняет их в массиве @F (perl-массивы начинаются с 0, поэтому второй столбец будет $F[1] , третий $F[2] и т. Д.), , -F (опять как gawk ) устанавливает разделитель полей ввода. Итак, мы проверяем, превышает ли номер строки один ( $.>1 ), и если да, добавьте к нему значение chr 39 (a ' , thanks @josephR). Наконец, мы используем join для соединения каждого элемента в массиве @F с помощью "," и печати полученной строки.

Простое sed будет делать:

 $ sed 's/","/","\x27/' afile "col1","'col2","col3","col4","col5" "value11","'value12","value13","value14","value15" "value21","'value22","value23","value24","value25" "value31","'value32","value33","value34","value35" 

Детали

Мы ищем первое вхождение "," и заменяем его ","` . Однако сбежать от обратного хода может быть сложно. Поэтому просто поставьте свой шестнадцатеричный код escape-кода, \x27 .

Твоя проблема

Это можно адаптировать так, чтобы ограничить изменения только теми строками, которые вы хотите.

 $ cat <(head -n +1 afile) <(tail -n +2 afile | sed 's/","/","\x27/') "col1","col2","col3","col4","col5" "value11","'value12","value13","value14","value15" "value21","'value22","value23","value24","value25" "value31","'value32","value33","value34","value35" 

Или вы можете пропустить первую строку целиком, используя sed если знаете трюк 8-):

 $ sed '2,$s/","/","\x27/' afile "col1","col2","col3","col4","col5" "value11","'value12","value13","value14","value15" "value21","'value22","value23","value24","value25" "value31","'value32","value33","value34","value35" 

Это говорит sed чтобы взять только вторую строку до последней строки ( $ ) и запустить их через поиск и заменить.

  • Как я могу написать во вторую строку файла из командной строки?
  • Как вставить содержимое файла в строку в bash
  • Как заменить строку командой в linux
  • Существует ли `sed` во всех * nixes?
  • команда sed для обмена символами
  • Как удалить строки, где данная часть строки содержит более 100 символов?
  • Sed удалить строку, если n-й символ не является конкретным символом
  • Удалите несколько запятых из определенного столбца файла с разделителями табуляции и распечатайте слова на новой строке
  • Заменить строку перед определенной строкой
  • Переиндексация большого файла CSV
  • Sed заменить не функционирует, как ожидалось
  • Interesting Posts

    Что мне не нужно делать резервными копиями?

    Выполнение команд после событий, основанных на событиях

    Драйвер RX 480 AMDGPU не загружается на Debian Sid

    Навигация и изображения в текстовом браузере Lynx

    Есть ли вариант Linux или Unix, который не требует открытого лицензирования?

    Будет ли своп SSD повысить производительность?

    Учет уникальных пользователей в файле wtmp

    Bash: изменить переменную, определенную в верхней части скрипта

    Запустить приложение при запуске

    Получение pid для процесса ssh, который основывался на себе

    sed, чтобы удалить все строки с рисунком и добавить строки в конце

    Исправляет ли CVE-2017-16939 версия пакета ядра 3.10.0-862.11.6.el7.x86_64?

    Будет ли wget -k по-прежнему преобразовывать ссылки в относительные пути, если wget остановлен преждевременно?

    LinuxMint15: приостановка работы ОЗУ не работает

    Значение параметра «kernel.sched_min_granularity_ns» в RHEL6 / RHEL7

    Linux и Unix - лучшая ОС в мире.