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

У меня есть 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 чтобы взять только вторую строку до последней строки ( $ ) и запустить их через поиск и заменить.

  • Как печатать строки между шаблоном 1 и 2-м совпадением шаблона2?
  • Извлечение записей фиксированной ширины без разделителя из одной строки
  • sed string для точного соответствия, содержащего /
  • Почему пустая выгрузка этого `sed ... << END_SED | вырезать ... `?
  • Использование буквальных пустых фигурных скобок {} внутри команды sed из find -exec
  • SED Поиск и замена на Linux
  • как удалить все двойные кавычки из csv за исключением определенного поля
  • Удалить пробелы после определенного символа
  • Удаление лишних пробелов, но не новая строка из csv-файлов
  • Разбить заголовок в файле и на основе заголовка заменить значение в файле
  • Как извлечь первую часть имен файлов с тем же суффиксом?
  • Interesting Posts

    wget с проверкой 304

    Как я могу поменять два символа в командной строке?

    Установка php5.6.2 с помощью httpd24 (версия Apache версии 2.4.10) на centos / rhel

    Правильно ли установлен приоритет сценария S25mdadm?

    Команда Android build aapt «невозможно выполнить двоичный файл»

    Настольное приложение, запускаемое пользователем администратора (но не явно с sudo), принимает права собственности на файл общего доступа

    Назначьте несколько переменных окружения одной переменной и расширьте их по команде

    Как я могу запустить системные единицы systemd по порядку?

    Как найти, что выполняет перенаправление портов?

    mv «Не каталог», когда имя цели слишком длинное

    Используйте команду find для преобразования файлов разметки в html

    Редактор Kate: как определить / добавить фильтры типов файлов в диалоговом окне файлов?

    Можно ли настроить централизованно настроенные сценарии входа в Linux?

    Каковы операторы управления и перенаправления оболочки?

    Дрейф часов в гостевой системе VirtualBox

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