我希望将数据集中的一列拆分为两列,同时仍然保留数据集中的所有其他列/数据。
例如,我的数据看起来像(...代表更多列,数据集非常大):
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
答案3
您的第一种方法有什么问题(除了用空格代替冒号之外<TAB>
)?尝试适应:
awk '{sub (/:/, OFS)} 1' OFS="\t" file