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.0
0.0
000
001