如何根据某个字符将一列分成两列?

如何根据某个字符将一列分成两列?

我希望将数据集中的一列拆分为两列,同时仍然保留数据集中的所有其他列/数据。

例如,我的数据看起来像(...代表更多列,数据集非常大):

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编号(第二列我)我试图创造)消失了。

例如我尝试了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

使用 bash 的ANSI-C 引用

答案3

您的第一种方法有什么问题(除了用空格代替冒号之外<TAB>)?尝试适应:

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

相关内容