「0」と最初の2つのフィールドを除くcsvファイルのすべてのテキストを1に変換するには?

「0」と最初の2つのフィールドを除くcsvファイルのすべてのテキストを1に変換するには?

いくつかの大きな .csv ファイルがあり、このファイルをバイナリ (1 と 0) 形式に変換したいと思います。最初の2つのフィールドを除いて、テキストを含むすべてのセルは1になり、0は0のままです。

head Test.csv
Iss1,1,0,0,Hsapiens-I34,0,0,0,Mmusculus-H01,0,0
Iss1,11,0,Scerevisiae-U09,Hsapiens-I05,0,0,0,0,0,0
Iss1,21,0,0,Hsapiens-I05,0,0,0,Hsapiens-I31,0,0
Iss1,31,0,0,Mmusculus-H13,0,0,0,0,0,Hsapiens-I31
Iss1,41,0,Scerevisiae-U09,0,0,0,0,0,0,Hsapiens-I21
Iss1,51,0,0,0,0,0,0,Scerevisiae-U25,0,Hsapiens-I21
Iss1,61,0,0,Hsapiens-I34,0,0,0,Mmusculus-H13,0,0

予想される結果は

head Test.csv
Iss1,1,0,0,1,0,0,0,1,0,0
Iss1,11,0,1,1,0,0,0,0,0,0
Iss1,21,0,0,1,0,0,0,1,0,0
Iss1,31,0,0,1,0,0,0,0,0,1
Iss1,41,0,1,0,0,0,0,0,0,1
Iss1,51,0,0,0,0,0,0,1,0,1
Iss1,61,0,0,1,0,0,0,1,0,0

ここで、ファイル内のすべてのテキストは1に変換されます。

誰もがこの問題を克服する方法についてアドバイスをすることができれば非常に感謝します。

ありがとう

ベストアンサー1

一緒にawkできること:

awk 'BEGIN {FS=OFS=","} {for (i=3;i<=NF;i++) {$i==0?1:$i=1}} 1' test.csv
  • BEGIN {FS=OFS=","}- 入力と出力の区切り文字をコンマに設定します。
  • for (i=3;i<=NF;i++)- 最大フィールド数に達するまでフィールド3を繰り返します。NF
  • $i==0?1:$i=1- フィールドが()iの場合は0何もせず1、そうでない場合はフィールドをi次に設定します。1
  • 1-1をtrueと解釈awkし、デフォルトでレコードを印刷します。

@EdMortonのコメントで提案したように、$1=($i!=0)isを使用する方が短い選択肢です。$i==0?1:$i=1

  • $i!=0iフィールドが次の場合は論理テストです。いいえ 0。それに応じてフィールド値をawk返し、上書きします。1true0false

おすすめ記事