我有一个包含 7 列的 csv 文件。它包含空单元格,单元格之间有一些空格。我该如何用 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 命令,这意味着如果前一个替换命令成功则跳转到标签。