これと非常によく似た作業を行う必要があります。文字列を順次インデックスに置き換えるしかし、列に数字を追加する代わりに、列全体を増加する数字に置き換えます。このように:
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
コマンドは、各行の前に行番号とタブ文字を追加して、指定された行を印刷します。これはタブ区切り形式に最適です。