Как Снабдить префиксом значения столбцов апостроф (')?

На Linux Вы, вероятно, уже имеете tmpfs файловая система, в которую можно записать в /dev/shm.

$ >/dev/shm/foo
$ df /dev/shm/foo
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                   224088         0    224088   0% /dev/shm

Это может использовать подкачку, как бы то ни было. Для истинного электронного диска (который не подкачает), необходимо использовать ramfs файловая система.

mount ramfs -t ramfs /mountpoint
4
23.10.2013, 21:17
4 ответа

sed:

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

Используя EREs для избавлений от части выхода:

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

awk:

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

Если Вы не хотите волноваться о заключении в кавычки, используйте управляющий код:

awk -F, '{sub(/^"/,"\"\x27",$2)}1' test.in
5
27.01.2020, 20:45
  • 1
    Да, я рассмотрел поиск управляющего кода, но это - хорошая практика для OP, чтобы быть осторожным с заключением в кавычки. –  Kevin 23.10.2013, 21:31
  • 2
    у меня есть управляющий код в моем. –  slm♦ 23.10.2013, 21:33
  • 3
    @slm Да, но кавычки представляет больший интерес, :) –  Kevin 23.10.2013, 21:36
  • 4
    @Kevin - я не мог понять их быстро так пошел с Escape. –  slm♦ 23.10.2013, 21:36

Использование 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

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

5
27.01.2020, 20:45
  • 1
    я люблю Perl и использую его ежедневно, но когда эти решения отправляются, он похож на наблюдение воздушного поставщика услуг ремесла, вытягивающего до сражения фрегата 8-). –  slm♦ 23.10.2013, 21:38
  • 2
    @slm Все зафиксированные теперь. –  Joseph R. 23.10.2013, 21:46
  • 3
    @slm. Я протестировал его на файле точно как предусмотрено в примере, и это работало. –  Joseph R. 23.10.2013, 21:49
  • 4
    я вижу проблему, Вы записываете изменения обратно в файле. Работы теперь. А-ч –  slm♦ 23.10.2013, 21:51

Вот простофиля один:

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

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

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


Можно также сделать это в жемчуге (естественно, можно сделать все в жемчуге):

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

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

5
27.01.2020, 20:45
  • 1
    Лучше, чем мой 8-( –  slm♦ 23.10.2013, 21:32
  • 2
    @slm приема не знает, использование управляющего кода является лучшей практикой, я просто не мог быть побеспокоен для поиска его, и Ваш короче, если Вы добавляете 2,$ поскольку Kevin имеет. –  terdon♦ 23.10.2013, 21:34
  • 3
    Для решения для Perl не делайте Вы имеете в виду -F'","' и join("\",\""... как Вы выполнили gawk? –  Joseph R. 23.10.2013, 21:52
  • 4
    @JosephR. нет, потому что это перестало работать на первом поле, и оказывается, что синтаксис более ясен этот путь. Я также нашел, что должен был выйти " для -F и это просто стало слишком сложным. Это перестанет работать, если OP будет иметь кавычки в полях (и он делает на основе своих других вопросов), но эй, который не был упомянут здесь :). Между прочим, я бесстыдно украл char 39 от Вас надежда Вы не возражаете. –  terdon♦ 23.10.2013, 21:57
  • 5
    @JosephR. сделанный, работы для запятых в полях теперь. –  terdon♦ 23.10.2013, 22:04

Простое 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"

Подробнее

Мы ищем первое вхождение "," и замена его с ","`. Однако выход обратной галочки может быть хитрым. Поэтому просто поместите его шестнадцатеричный эквивалентный управляющий код, \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 проводить только 2-ю строку до последней строки ($) и выполненный те, которые посредством поиска и замены.

4
27.01.2020, 20:45
  • 1
    Sed, может пропустить первую строку без справки, sed '2,$s/...' –  Kevin 23.10.2013, 21:33
  • 2
    @Kevin - да я просто видел в Вашем, не знал, что –  slm♦ 23.10.2013, 21:34
  • 3
    @Kevin - надеется, что Вы не возражаете, я добавил использование в качестве примера 2,$. –  slm♦ 23.10.2013, 21:36
  • 4
    Конечно, не, я добавил Ваш Escape также –  Kevin 23.10.2013, 21:36

Теги

Похожие вопросы