いくつかの大きな .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!=0
i
フィールドが次の場合は論理テストです。いいえ0
。それに応じてフィールド値をawk
返し、上書きします。1
true
0
false