2017-07-04 10 views
0

タブ区切りファイル内の単一のゼロ(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 

が、私は、データフレームのヌル施策に合致したい

は、私はテーブルがあるとします。

答えて

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ある ield S eparator F [入力]。 OFS, utput f ield s eparatorです。すべての入力フィールド上
  • for (i=1; i<=NF; ++i)ループ(NFは、入力フィールドの数である)、タブにより各入力ラインを分割から生じます。もしそうであれば、文字列0と同一であるとするため

    • if ($i=="0") {$i="NA"}試験各フィールドを、文字列NAと($i)そのフィールドを置き換えます。フィールドにを割り当てる

    • は、手で入力線は、セパレータとしてOFSの値を使用して、暗黙的に(変更)フィールドの値からを再構築あります。

  • print単に手で(潜在的に修飾された)入力ラインを印刷します。 GNUで

0

はsedを:

後方参照を使用して
sed -E ':a;s/(\t)*\b0\b(\t)/\1NA\2/g;ta;' file 

、これは最終的にNAとキャプチャタブとタブ(\t)に続いての先行0を交換してください。ERE用-Eのためのsed GNUやOSXで

0

$ 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 

は、2回のパスを取る理由のためhttps://stackoverflow.com/a/44908420/1745001を参照してください。

関連する問題