Ich muss etwas sehr Ähnliches tunErsetzen Sie die Zeichenfolge durch einen sequenziellen Index., aber ich muss keiner Spalte eine Zahl hinzufügen, sondern eine ganze Spalte durch fortlaufende Zahlen ersetzen. So:
0 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32
0 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32
0 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
0 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
0 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
wird
0 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32
1 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32
2 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
(Es ist mir egal, ob es mit 0 oder 1 beginnt)
Ich fühle mich sehr dumm, aber ich kann die Lösung dieser Frage nicht auf meinen Fall übertragen ...
Antwort1
Um Zeilen zu nummerieren, können Sie verwenden nl
. Um Spalten zu entfernen (oder vielmehr diejenigen herauszufiltern, die Sie behalten möchten), können Sie verwenden cut
:
$ cut -f 2- cols.txt | nl
1 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32
2 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32
3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
5 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
Das einzig Ärgerliche dabei nl
ist, dass es am Zeilenanfang Leerzeichen einfügt (standardmäßig ist das Zeilennummernfeld 6 Zeichen breit und Sie möchten dies nicht verkleinern, da dies die Zeilennummern abschneiden würde). Wir können diese wie folgt entfernen:
$ cut -f 2- cols.txt | nl | sed 's/^ *//'
1 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32
2 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32
3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
5 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
Das cut
Dienstprogramm nimmt eine Liste der Spalten, die Sie aus der Eingabe „ausschneiden“ möchten. In unserem Fall sind das die Spalten 2 und höher ( -f 2-
). Da Ihre Daten tabulatorgetrennt sind, cut
wird dies ohne Änderung durchgeführt, andernfalls können Sie ihm mit mitteilen, ein anderes Trennzeichen zu verwenden -d
.
Der sed
Befehl ersetzt einfach diese Leerzeichen am Anfang der Zeile durch nl
nichts.
Antwort2
Mitawk
$ awk '{$1=FNR-1; print}' OFS='\t' file
0 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32
1 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32
2 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
Antwort3
Mit ed
(unter Verwendung eines wörtlichen Tabulators, zusammengesetzt als Ctrl-V+ TAB, bei der Ersetzung)
$ ed -s file << EOF
,s/0 //
,n
q
EOF
1 0 chr1 3000575 3000801 0 chr1 4340023 4340249 32 32
2 0 chr1 3000641 3000801 -1 chr1 3311943 3311783 32 32
3 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
4 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
5 0 chr1 3000674 3000801 -1 chr1 3001534 3001407 32 32
Der (.,.)n
Befehl druckt die adressierten Zeilen und stellt jeder Zeile ihre Zeilennummer und einen Tabulator voran – perfekt für Ihr tabulatorgetrenntes Format.