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*.out
Datei.
- Erstellen Sie eine Variable für diese Datei im temporären Verzeichnis
- Entfernen Sie das
chr
Präfix - Entfernen Sie das
.out
Suffix awk
ersetzt dann alleNA
in 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 -i
In-Place-Option nutzen kann
Antwort2
Ich schlage ein sed
Skript zur Verarbeitung aller Dateien vor.
sed -i 's/ NA / 1 /' chr{1..22}.out