2016-02-11 4 views
-1

У меня есть файл csv, который я рассматриваю в bash, который я пытаюсь манипулировать. Есть несколько вещей, которые я/пытаюсь изменить. Структура, как так, где первая строка в столбец (поле) заголовкиИзмените имя поля и отредактируйте файл csv

cat,dog,hippopotamus,zebra 
1,,3,2 
three species, five species,only one,multiple 
at,home, at, home, wild, wild 
  1. Как я могу редактировать поля (колонки) имена в формате CSV?

    head -1 test.csv 
    

    показывает, что имена полей (столбцов), но она все еще имеет запятые в нем, как хорошо, и это не позволяет имени поля меняющегося на всех.

    Другая часть этого вопроса заключается в том, что я хочу только редактировать заголовки длиной более 8 символов, и в этом случае я просто возьму первые 8 символов. Я предполагаю, что я использовал бы какой-то цикл, основанный на длине строки, но так как я не знаю, как даже редактировать имя поля только одного столбца, я не уверен, как это сделать. В приведенном выше сценарии изменение hippopotamus на hippopot.

  2. Как заменить пустые ячейки в csv на NA или NULL?

    sed -i 's/ /NULL/g' 
    

    Мысль будет работать, но это не так.

  3. Некоторые из ячеек содержат в себе запятые, испорченные разделителем ,. Я использовал код ниже и, похоже, работает, но есть ли лучший/более безопасный способ сделать это?

    sed -i "s/, /_/g" 
    
  4. Или в подобной ситуации, если несколько столбцов содержат строки иногда с пробелами в пределах строки, но я только хочу, чтобы удалить пространство в одном из столбцов, оставляя другие столбцы в одиночку, как я могу добиться этого ?

    sed -i 's/ //g' test.csv 
    
+2

Если имя поля содержит запятые, как определяется то, что принадлежит к какой области? поля не цитируются? В противном случае это не является должным образом «разделенным запятой». –

+0

Все, что вы хотите сделать, абсолютно тривиально в awk и было разрешено тысячи раз на этом сайте, а другие - просто google. Сказав это, ваш введенный образец ввода не имеет смысла, см. Комментарий от @BenjaminW. –

ответ

0
  1. Sed позволит номер строки в качестве префикса команды, работать только на одной строке (или диапазон чисел, для работы на линии в этом диапазоне). Попробуйте что-то вроде этого.

    sed -e '1s/cat/Feline/' test.csv > test2.csv 
    
  2. CSV файлы будут храниться пустое поле либо запятой в начале строки, запятой в конце строки или запятой с последующим другой запятой:

    Field1,Field2,Field3 
    ,"<-- empty field1",field3 
    field1,,"<-- empty field2" 
    field1,"empty field3-->", 
    

    Вы можете использовать Ниже sed команды, чтобы исправить это:

    sed -e 's/^,/NA,/;s/,$/,NA/' -e ':loop' -e 's/,,/,NA,/g;tloop' test.csv 
    
  3. Ваше решение кажется хорошим. Однако имейте в виду, что CSV должен иметь кавычки вокруг любой строки, содержащей запятую. И это законно. Это также точка, где sed перестает быть хорошим инструментом для управления CSV-файлами. ;-) Одним из предложений было бы заменить запятые «интерьер» запятыми «% 2C», который является кодировкой HTML для запятой. Это довольно характерно и, по крайней мере, несколько стандартно.

  4. sed группы номеров, начинающиеся с самого левого.Если ваши группы совпадают несколько раз, вы можете получить только последнее содержимое совпадения, но если внешняя группа содержит множественное совпадение, внешняя группа остается действительной. (Здесь я предполагаю, что вы уже заменили «внутренние» запятые с чем-то еще.)

    sed -e ':loop' -e '^\(\([^,]*,\)\{3\}\)\([^ ,]*\) /\1\3/;tloop' 
    

    Это удалит первое место в колонке 4, а затем цикл. Он останавливается, когда находит запятую, которая заканчивает колонку или конец строки.

    Обратите внимание, что первая часть, называемая \1, является общей. Вы можете заменить 3 на любое поле, минус одно, и это приведет вас к началу поля. Фактическая работа находится во второй части, \3, где вы можете делать то, что вам нравится. (Обратите внимание, что \2 входит в \1, и не особенно полезно.)

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