Перекодировать значения столбцов на основе предыдущих значений

Перекодировать значения столбцов на основе предыдущих значений
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

Похоже, что вы добавляете измененное значение как новый столбец в свой код. Если вам нужно вывести его в новом столбце, сделайте следующее, предполагая, что значение седьмого столбца всегда равно 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.0или 0.0, или чисел с ведущими нулями, такими как 000или 001и т. д.

Связанный контент