Spaltenwerte auf Basis vorheriger Werte neu kodieren

Spaltenwerte auf Basis vorheriger Werte neu kodieren
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

Oben ist das Beispiel meines Datensatzes. Ich möchte die Werte der 7. Spalte so ersetzen, dass 1 durch 2 und 0 durch 1 ersetzt wird. Das von mir erwartete Ergebnis sollte also wie folgt aussehen.

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

Ich habe versucht, diesen Ansatz zu verwenden

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

und dann die erste Reihe entfernen. Aber ich brauche einen direkten Weg.

Antwort1

Wenn der Wert in Spalte 7 immer 0 oder 1 ist, können Sie Folgendes verwenden :

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

wenn nicht, überprüfen Sie, ob der Wert 0 oder 1 ist:

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

es sieht so aus, als ob Sie den geänderten Wert als neue Spalte in Ihren Code einfügen. Wenn Sie ihn in einer neuen Spalte drucken müssen, gehen Sie wie folgt vor, wobei Sie weiterhin davon ausgehen, dass der Wert der Spalte 7 immer 0 oder 1 ist:

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

ansonsten:

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

Hinweis: Ändern Sie $7 ~/^[01]$/es in ($7==1 || $7==0), um streng zu prüfen, ob der Wert tatsächlich eine Zahl ist, anstatt das vorherige () zu verwenden, das nur nach einer einzelnen ganzzahligen Ziffer 0 oder 1 sucht, was zur Folge hat, dass es für Gleitkommazahlen wie oder oder Zahlen mit führenden Nullen wie oder usw. $7 ~/^[01]$/nicht funktioniert.1.00.0000001

verwandte Informationen