特定の文字に基づいて列を2つの列に分割するには?

特定の文字に基づいて列を2つの列に分割するには?

データセット内の他のすべての列/データを維持しながら、データセットの1つの列を2つの列に分割したいと思います。

たとえば、私のデータは次のようになります(...より多くの列を表し、データセットが非常に大きい)。

Gene   qval    ...  Chromosome Position
ACE    0.3748  ...    1:234689650
NOS    0.2     ...    2:374896578
BRCA   0.345   ...    12:897655323

:染色体位置に基づいて染色体位置の列を次のように分割したいと思います。

Gene   qval    ...   Chromosome    Position
ACE    0.3748  ...    1            234689650
NOS    0.2     ...    2            374896578
BRCA   0.345   ...    12           897655323

これまでに試したことは、新しい列を作成しないか、データセットの残りの部分を破損して混乱したり、所定の位置から外れて、最初の列が奇妙なChromsome染色体番号で表示されるようにするようですが、より大きなPosition数字(2番目の列I)を作成しようとしましたが、消えます。負けました。

たとえば、私は3つの方法を試しました。

awk 'sub(/\:/," "){$1=$1}1' OFS="\t" file1.txt > file2.txt #displaces columns and removes position column

tr ':' $' ' < file1.txt > file2.txt  #removes : but doesn't divide into 2 columns

sed 's/:/ /g' < file1.txt > file2.txt  #removes : but doesn't divide into 2 columns

同様の質問に基づいてこのようなコードを試しましたが、ほとんどは列を区切り文字に分割するのではなく、列を半分に切り、下半分を新しい列に移動したいと思います。

私のデータはタブ区切りのファイルにあります。私はLinuxに初めて遭遇したので間違っているかもしれませんが、私のコードは、タブsed 区切りtr文字で数字の間に新しく配置されたスペースを考慮すると、分割が完了したことを示すコマンドが必要なので、新しい列として扱われますか?

答え1

ミラーの使用(https://github.com/johnkerl/miller)と実行

mlr --tsv nest --explode --values --across-fields --nested-fs ":" -f "Chromosome Position" \
then rename "Chromosome Position_1",Chromosome,"Chromosome Position_2",Position input.tsv >output.tsv

あなたはやる

+------+--------+------------+-----------+
| Gene | qval   | Chromosome | Position  |
+------+--------+------------+-----------+
| ACE  | 0.3748 | 1          | 234689650 |
| NOS  | 0.2    | 2          | 374896578 |
| BRCA | 0.345  | 12         | 897655323 |
+------+--------+------------+-----------+

答え2

データがタブで区切られている場合は、コロンをタブに置き換えます。

tr : $'\t' < file

バッシュを使ってANSI-Cの引用

答え3

コロンを空白に置き換えることに加えて、最初のアプローチにはどのような問題がありますか<TAB>?適応してみてください:

awk '{sub (/:/, OFS)} 1' OFS="\t" file

関連情報