У меня есть CSV-файл, который имеет 7 столбцов. В нем есть пустые ячейки и несколько пробелов между ячейками. Как я могу заменить пустые ячейки на NA и удалить лишние пробелы? Большое спасибо!

Вот как выглядит мой файл, но здесь, кажется, он искажается, когда я копирую его и пропускаю.

130070078,PPW0001,1,4,4HW             ,2,15.61943874
120040039,PPW0002,0,0,                ,0,0
120040043,PPW0003,1,3,3WE             ,1,14.43394935

3 ответа3

1

Использование sed которое будет работать и для повторяющихся пустых полей:

sed ':l;s/,,/,NA,/;tl; s/[[:blank:]]*//g'

Или используя awk:

awk '{i=0;while(i++<2){gsub(/,,/,",na,");gsub(/ /, "")}}1'

Входные данные:

130070078,PPW0001,1,4,4HW         ,2,15.61943874
120040039,PPW0002,0,0,            ,0,0
120040043,PPW0003,1,3, 3WE       ,1,14.43394935
120040043,PPW0003,1 ,3,3WE         ,1,14.43,,,3,,94,,,,9,,,,,35
120040043,PPW0003,0, 2, 3WE       ,1,14.43,,,3,,94,,,,9,,,,,35

Выход:

130070078,PPW0001,1,4,4HW,2,15.61943874
120040039,PPW0002,0,0,,0,0
120040043,PPW0003,1,3,3WE,1,14.43394935
120040043,PPW0003,1,3,3WE,1,14.43,NA,NA,3,NA,94,NA,NA,NA,9,NA,NA,NA,NA,35
120040043,PPW0003,0,2,3WE,1,14.43,NA,NA,3,NA,94,NA,NA,NA,9,NA,NA,NA,NA,35
0

Ответ αғsнιη работал для меня, но я просто хотел бы немного его объяснить.

Я пытался что-то вроде этого:

echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'

Какие выводы

1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6

Из-за повторяющихся пустых полей последняя запятая является частью первой замены и началом следующей требуемой замены, поэтому вы просто заменяете каждое второе пустое поле.

Теперь вы можете сделать что-то вроде:

echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'

или же

sed 's/,,/,-,/g;s/,,/,-,/g'

Который заменит все ячейки, поскольку вторая команда получит те, которые пропущены, но это немного грязно.

Команда αғsнιη делает по существу то же самое, используя метку и прыжок, чего я не знал, что вы могли бы сделать.

sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'

выход:

1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6

Итак, первая часть команды создает метку.

Тогда у нас такая же замена.

Затем у нас есть команда t, которая означает переход к метке, если предыдущая команда замещения была успешной.

Дополнительная информация: http://www.grymoire.com/Unix/Sed.html#uh-59.

0

Ваш ответ:

sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' > file2

Чтобы получить 'NA' в последнем поле, если пусто:

sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'> file2

Вы также можете использовать:

sed 's/,,/,NA,/g' file1 | tr -d ' ' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .