Wie ersetze ich alle Werte (alle NAs) in einer Spalte durch den numerischen Teil des Dateinamens?

Wie ersetze ich alle Werte (alle NAs) in einer Spalte durch den numerischen Teil des Dateinamens?

Ich habe mehrere (22) Dateien, die wie folgt benannt sind:

chr1.out, chr2.out...,chr22.out

jede dieser Dateien hat 46 Spalten und mehrere Zeilen

Die ersten 6 Spalten und 6 Zeilen in einer dieser Dateien sehen folgendermaßen aus:

  alternate_ids      rsid chromosome position alleleA alleleB index
     rs4814683 rs4814683         NA     9795       G       T     1
     rs6076506 rs6076506         NA    11231       T       G     2
     rs6139074 rs6139074         NA    11244       A       C     3
     rs1418258 rs1418258         NA    11799       C       T     4
     rs7274499 rs7274499         NA    12150       C       A     5
     rs6116610 rs6116610         NA    12934       G       A     6

Nehmen wir an, dies befindet sich in der Datei chr1.out

ich möchte alle NAs in der Spalte „Chromosom“ durch 1 ersetzen.

also würde es so aussehen:

  alternate_ids      rsid chromosome position alleleA alleleB index
     rs4814683 rs4814683         1     9795       G       T     1
     rs6076506 rs6076506         1    11231       T       G     2
     rs6139074 rs6139074         1    11244       A       C     3
     rs1418258 rs1418258         1    11799       C       T     4
     rs7274499 rs7274499         1    12150       C       A     5
     rs6116610 rs6116610         1    12934       G       A     6

Ich möchte das Gleiche für jede dieser 22 Dateien tun. Also erhält chr2.out 2 in der 3. Spalte, chr3.out erhält 3 in der 3. Spalte usw.

Antwort1

Verwenden eines Bash-Skripts:

#!/bin/bash

tmp_d=$(mktemp -q -d -t 'replace.XXXXX' || mktemp -q -d)

for f in chr*.out; do
    tmp_f="${tmp_d}/$f"
    n="${f#chr}"
    n="${n%.out}"
    awk -v n="$n" '$3 == "NA" { $3=n }1' "$f" > "$tmp_f"
    mv "$tmp_f" "$f"
done

rm -r "$tmp_d"

Zuerst erstellen wir ein temporäres Verzeichnis, da wir temporäre Dateien erstellen werden

Dann durchlaufen wir jede chr*.outDatei.

  • Erstellen Sie eine Variable für diese Datei im temporären Verzeichnis
  • Entfernen Sie das chrPräfix
  • Entfernen Sie das .outSuffix
  • awkersetzt dann alle NAin der dritten Spalte durch die aus dem Dateinamen extrahierte Nummer und speichert diese in der temporären Datei
  • Ersetzen Sie die Originaldatei durch die temporäre Datei

Nachdem die Schleife beendet ist, entfernen wir das temporäre Verzeichnis.

Der ganze temporäre Kram lässt sich vermeiden, wenn Sie GAWK haben, das die -iIn-Place-Option nutzen kann

Antwort2

Ich schlage ein sedSkript zur Verarbeitung aller Dateien vor.

sed -i 's/         NA  /          1  /' chr{1..22}.out 

verwandte Informationen