以前の値に基づいて列値を再コーディングします。

以前の値に基づいて列値を再コーディングします。
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

上記は私のデータセットの例です。 1が2に変わり、0が1に変わるように7番目の列の値を変更したいと思います。だから私の予想結果は以下の通りです。

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]$/ように変更されました($7==1 || $7==0)。古い()を使用する代わりに単一の整数の数字0または1のみを確認するため、orまたはorなどの前にゼロがある数字などの$7 ~/^[01]$/浮動小数点数には機能しません。 。1.00.0000001

関連情報