Ich versuche, diese Datei zu verwenden ...
MT 200610-1 100 2757
MT 200610-10 100 6753
MT 200610-100 100 15173
Möchten Sie eine neue Datei erstellen, die wie folgt aussieht, und dabei die Spalten 1, 2 und 4 verwenden …
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
Wenn ich nur die ersten drei so mache, klappt es.
awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' test_ace_geno1.map
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173
Wenn ich versuche, die 2. Spalte am Ende hinzuzufügen, passiert etwas Seltsames ...
awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' test_ace_geno1.map
200610-16 2757
200610-10 6753
200610-100 15173
Wenn ich Vim mit einer festgelegten Liste ausführe, wird angezeigt, dass es sich um eine normale Registerkarte handelt. Daher bin ich nicht sicher, was hier mit dieser Spalte passiert, die das Ganze durcheinander bringt.
MT^I200610-1^I100^I2757$
MT^I200610-10^I100^I6753$
MT^I200610-100^I100^I15173$
Antwort1
mit dos
Stilzeilenenden:
$ cat -e ip.txt
MT 200610-1 100 2757^M$
MT 200610-10 100 6753 ^M$
MT 200610-100 100 15173^M$
$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4}' ip.txt
chrMT 2756 2757
chrMT 6752 6753
chrMT 15172 15173
$ awk 'BEGIN{FS=="\t";OFS=="\t"}{print "chr"$1,$4-1,$4,$2}' ip.txt
200610-16 2757
chrMT 6752 6753 200610-10
200610-100 15173
Mit können Sie sowohl das Ende der Stilzeile als auch das Abrufen der erforderlichen Ausgabe perl
handhaben :dos
$ perl -lane 'print "chr$F[0]\t", $F[3]-1, "\t$F[3]\t$F[1]"' ip.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
Mit awk
wird das Zeilenende in unix
style first geändert, mit dos2unix
wenn verfügbar oder mitperl
$ perl -i -pe 's|\r\n|\n|' ip.txt
$ cat -e ip.txt
MT 200610-1 100 2757$
MT 200610-10 100 6753 $
MT 200610-100 100 15173$
und dann
$ awk -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100
oder mit GNU awk
, Eingabedatensatz so einstellen, dass Zeilenenden im DOS-Stil verarbeitet werden
gawk -v RS='\r\n' -v OFS='\t' '{print "chr"$1,$4-1,$4,$2}' ip.txt
Antwort2
Bringen Sie alles in der print
Anweisung in das gewünschte Format und führen Sie alle erforderlichen Operationen aus, z. B. $NF - 1
auch die Subtraktion:
awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt
$4
Sie können hier natürlich stattdessen verwenden $NF
, aber da das vierte Feld das letzte ist, würden beide auf dasselbe Feld verweisen.
Beispiel:
% awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt
chrMT 2756 2757 200610-1
chrMT 6752 6753 200610-10
chrMT 15172 15173 200610-100