根据以前的值重新编码列值

根据以前的值重新编码列值
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 的方式替换第七列的值。所以我期望的结果应该如下所示。

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)严格检查它们的值是否确实是一个数字,而不是使用前一个 ( $7 ~/^[01]$/) 仅检查单个整数数字 0 或 1,因此不适用于浮点数,例如1.0or0.0或 number带有前导零,如000001等。

相关内容