替换制表符分隔值文件的单个零

时间:2017-07-04 22:12:08

标签: regex awk sed

如何在制表符分隔值文件中用字符串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 

也就是说,我想匹配数据框的空值。

3 个答案:

答案 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次传递。