
У меня есть файл 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
решение1
Ваш ответ:
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}'
решение2
Ответ αғ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