如何在制表符分隔值文件中用字符串0
替换单个零(NA
)?
假设我有桌子:
0\t0.15\t0t\8.05\t0\t0\t0.15\7.0306\n
5\t0.18\t0\8.05\t0\t0\t0.5t\50\n
1\t15\t0205\t0\t0.16\t200t\40.90\n
我想得到:
NA\t0.15\NAt\8.05\tNA\tNA\t0.15t\7.0306\n
5\t0.18\tNA\8.05\tNA\tNA\t0.5t\50\n
1\t15\t0205\tNA\t0.16\t200t\40.90\n
也就是说,我想匹配数据框的空值。
答案 0 :(得分:4)
awk
可实现强大,便携的解决方案:
awk 'BEGIN {FS=OFS="\t"} {for (i=1; i<=NF; ++i) { if ($i=="0") {$i="NA"} }; print}' file
BEGIN {FS=OFS="\t"}
告诉awk
- 在输入处理开始之前(BEGIN
) -
按标签字符(FS="\t"
)将输入行拆分为字段,并通过输出(OFS="\t"
)上的标签字符将它们分开。
FS
是[输入] f ield s eparator; OFS
是 o 输出 f 字段 s eparator。 for (i=1; i<=NF; ++i)
遍历所有输入字段(NF
是输入字段的数量),这是通过制表符分割每个输入行而产生的。
if ($i=="0") {$i="NA"}
测试每个字段是否与字符串0
相同,如果是,则用字符串$i
替换该字段(NA
)。
在分配字段时,手头的输入行使用{{1}的值从(修改的)字段值隐式重建 }作为分隔符。
OFS
只需打印(可能已修改的)输入行。
答案 1 :(得分:0)
使用GNU sed:
sed -E ':a;s/(\t)*\b0\b(\t)/\1NA\2/g;ta;' file
使用反向引用,最后替换0
,然后选择带有\t
和捕获标签的标签(NA
)。
答案 2 :(得分:0)
使用GNU或OSX sed for -E表示ERE:
$ sed -E 's/(^|\t)0(\t|$)/\1NA\2/g; s/(^|\t)0(\t|$)/\1NA\2/g' file
NA 0.15 NA 8.05 NA NA 0.15 7.0306
5 0.18 NA 8.05 NA NA 0.5 50
1 15 NA 205 NA 0.16 200 40.90
请参阅https://stackoverflow.com/a/44908420/1745001了解为何需要2次传递。