以遞增數字取代文字檔案中的第 i 列

以遞增數字取代文字檔案中的第 i 列

我需要做一些與此非常相似的事情用順序索引替換字串,但我不需要向列添加數字,而是用遞增的數字替換整個列。像這樣:

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

變成

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

(我不在乎是0還是1開頭)

我覺得很愚蠢,但我無法根據我的情況調整該問題的解決方案...

答案1

若要對行進行編號,您可以使用nl.要刪除列(或過濾掉您想要保留的列),您可以使用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

唯一煩人的事情nl是它在行的開頭插入空格填充(預設情況下,行號字段是 6 個字元寬,並且您不希望降低此寬度,因為它會截斷行號)。我們可以像這樣擺脫這些:

$ 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

cut實用程式會取得您想要從輸入中「刪除」的列的清單。在我們的例子中,它是第 2 列及以後的 ( -f 2-)。由於您的資料是製表符分隔的,因此cut無需修改即可執行此操作,否則可以告訴它使用另一個分隔符號-d

sed命令將簡單地替換行開頭的空格nl

答案2

awk

$ 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

答案3

With (在替換中ed使用文字製表符,組成為Ctrl-V+ )TAB

$ 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

(.,.)n指令列印指定的行,在每行前面加上行號和製表符 - 非常適合製表符分隔格式。

相關內容