Заполнение пустых мест в файле CSV - PullRequest
4 голосов
/ 02 февраля 2020

У меня есть CSV-файл, в котором некоторые столбцы пусты, например

oski14,safe,0,13,53,4
oski15,Unknow,,,,0
oski16,Unknow,,,,0
oski17,Unknow,,,,0
oski18,unsafe,0.55,,1,2
oski19,unsafe,0.12,4,,56

Как заменить все пустые столбцы словом «пустой». Я пытался использовать awk (это команда, которую я учусь использовать).

Я хочу получить

oski14,safe,0,13,53,4
oski15,Unknow,empty,empty,empty,0
oski16,Unknow,empty,empty,empty,0
oski17,Unknow,empty,empty,empty,0
oski18,unsafe,0.55,empty,1,2
oski19,unsafe,0.12,4,empty,56

Я попытался заменить только 3-й столбец, чтобы посмотреть, был ли я на правильном пути

    awk -F '[[:space:]]' '$2 && !$3{$3="empty"}1' file

это оставило меня с

oski14,safe,0,13,53,4
oski15,Unknow,,,,0
oski16,Unknow,,,,0
oski17,Unknow,,,,0
oski18,unsafe,0.55,,1,2
oski19,unsafe,0.12,4,,56

Я также пытался

    nawk -F, '{$3="\ "?"empty":$3;print}' OFS="," file

это привело к

oski14,safe,empty,13,53,4
oski15,Unknow,empty,,,0
oski16,Unknow,empty,,,0
oski17,Unknow,empty,,,0
oski18,unsafe,empty,,1,2
oski19,unsafe,empty,4,,56

Наконец я попытался

    awk '{if (!$3) {print $1,$2,"empty"} else {print $1,$2,$3}}' file

это оставило меня с

oski14,safe,empty,13,53,4 empty
oski15,Unknow,empty,,,0 empty
oski16,Unknow,empty,,,0 empty
oski17,Unknow,empty,,,0 empty
oski18,unsafe,empty,,1,2 empty
oski19,unsafe,empty,4,,56 empty

Ответы [ 2 ]

4 голосов
/ 02 февраля 2020

С помощью sed, который поддерживает ERE с аргументом -E (например, GNU sed или OSX / BSD sed):

$ sed -E 's/(^|,)(,|$)/\1empty\2/g; s/(^|,)(,|$)/\1empty\2/g' file
oski14,safe,0,13,53,4
oski15,Unknow,empty,empty,empty,0
oski16,Unknow,empty,empty,empty,0
oski17,Unknow,empty,empty,empty,0
oski18,unsafe,0.55,empty,1,2
oski19,unsafe,0.12,4,empty,56

Подстановка должна выполняться дважды, поскольку заданы непрерывные запятые, такие как ,,, одно совпадение с регулярным выражением будет использовать первые 2 , с, и поэтому у вас останется ,empty,,.

Приведенное выше изменит полностью пустую строку на empty, дайте нам знать, если это выпуск.

1 голос
/ 02 февраля 2020

Это команда awk

awk 'BEGIN { FS=","; OFS="," }; { for (i=1;i<=NF;i++) { if ($i == "") { $i = "empty" }}; print $0 }' yourfile

Как предлагается в комментариях, вы можете сократить процедуру BEGIN до FS=OFS=",", так как awk разрешает связанное назначение (чего я не знал Спасибо @EdMorton).

Я установил FS="," в процедуре BEGIN вместо использования опции -F, только для единообразия с настройкой OFS=",".

Понятно Вы можете поместить скрипт в более привлекательную форму:

#!/usr/bin/awk -f
BEGIN {
  FS  = ","
  OFS = ","
}
{
  for (i = 1; i <= NF; ++i)
    if ($i == "")
      $i = "empty"
  print $0
}

и использовать его как отдельную программу (вам нужно chmod +x), даже если известно, что у него есть некоторые недостатки (обратитесь к комментарии к этому вопросу, а также этот ответ ):

./the_script_above your_file

или

down_the_pipe | ./the_script_above | further_processing

Очевидно, что вы все еще можете передать приведенный выше скрипт в awk таким образом:

awk -f the_script_above file1 file2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...