Ersetzen Sie eine Textdatei der Spalte „i“ durch inkrementelle Zahlen

Ersetzen Sie eine Textdatei der Spalte „i“ durch inkrementelle Zahlen

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 nlist, 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 cutDienstprogramm 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, cutwird dies ohne Änderung durchgeführt, andernfalls können Sie ihm mit mitteilen, ein anderes Trennzeichen zu verwenden -d.

Der sedBefehl ersetzt einfach diese Leerzeichen am Anfang der Zeile durch nlnichts.

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 (.,.)nBefehl druckt die adressierten Zeilen und stellt jeder Zeile ihre Zeilennummer und einen Tabulator voran – perfekt für Ihr tabulatorgetrenntes Format.

verwandte Informationen