以前の値に基づいて列の値を再コード化する

以前の値に基づいて列の値を再コード化する
1859115 2258379 24636 Yes 06S14028968 13 1 1 2
1859115 2258379 24636 Yes 06S14028968 13 1 1 2
1859116 2255037 21608 Yes 06S14028969 11 0 2 3
1859117 2268746 34027 Yes 06S14028970 10 0 2 1

上記は私のデータ セットの例です。7 列目の値を 1 を 2 に、0 を 1 に置き換えたいと考えています。したがって、期待する結果は次のようになります。

1859115 2258379 24636 Yes 06S14028968 13 2 1 2
1859115 2258379 24636 Yes 06S14028968 13 2 1 2
1859116 2255037 21608 Yes 06S14028969 11 1 2 3
1859117 2268746 34027 Yes 06S14028970 10 1 2 1

私はこのアプローチを試してみました

awk 'NR==1{$10="Pheno";print;next}\
 $7 == "1" {$10="2"};\
 $7 == "0" {$10="1"}1'  old.txt |column -t > new.txt

そして最初の行を削除します。しかし、私は簡単な方法が必要です。

答え1

7 列目の値が常に 0 または 1 の場合は次のようにします。

awk 'NR>1{ $7+=1 }1' infile

そうでない場合は、その値が 0 か 1 かを確認します。

awk 'NR>1 && $7 ~/^[01]$/ { $7+=1 }1' infile

コード内で変更された値を新しい列として追加しているように見えますが、新しい列に印刷する必要がある場合は、列 7番目の値が常に 0 または 1 であるという同じ前提で次のようにします。

awk '{ print $0, (NR==1?"Pheno":++$7) }' infile

さもないと:

awk '{ print $0, (NR==1?"Pheno":($7 ~/^[01]$/?++$7:"NA") ) }' infile

注:$7 ~/^[01]$/を に変更すると、単一の整数桁 0 または 1 のみをチェックする($7==1 || $7==0)以前のもの ( ) を使用するのではなく、値が実際に数値であることを厳密にチェックします。その結果、やなどの浮動小数点数や、やなどの先頭にゼロがある数値など$7 ~/^[01]$/には機能しなくなります。1.00.0000001

関連情報