die Verwendung von awk zum Erstellen einer neuen Datei führt zu Problemen bei der Verwendung einer bestimmten Spalte. Ich kann nicht herausfinden, was falsch ist

die Verwendung von awk zum Erstellen einer neuen Datei führt zu Problemen bei der Verwendung einer bestimmten Spalte. Ich kann nicht herausfinden, was falsch ist

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 dosStilzeilenenden:

$ 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 perlhandhaben :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 awkwird das Zeilenende in unixstyle first geändert, mit dos2unixwenn 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 printAnweisung in das gewünschte Format und führen Sie alle erforderlichen Operationen aus, z. B. $NF - 1auch die Subtraktion:

awk '{print "chr" $1, ($NF - 1), $NF, $2}' file.txt

$4Sie 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

verwandte Informationen