如何将相应的字符串从与之共享字段的另一个文件添加到一个文件中?

如何将相应的字符串从与之共享字段的另一个文件添加到一个文件中?

我有两个文件都有“肿瘤 ID”字段。两者均以逗号分隔。我需要将文件2中唯一的一个字段添加到文件1中,并且我想根据“tumor id”中相应的字符串添加该字段的行。示例格式为:

文件1

Tumor_ID, Chromosome, start, end,
xxxxx,       2,        12,    13,
xxxxx,       3,        45,    46,
xxxxx,       3,        48,    49
xxxxx,       3,        51,    52,
nnnnn,       5,       55,    59,
nnnnn,       5,       57,    58,
lllll,      11,       13,    14,
lllll,      12,        16,    17,
eeeee,       2,        51,    52,
zzzzz,       9,      1000,   101,

文件2

Patient_No., Tumor_ID,  Normal_ID, 
4,            xxxxx,     hhhhh,            
5,            nnnnn,     aaaaa,          
8,            lllll,     ddddd,     
7,            eeeee,     ggggg,     
3,            zzzzz,     nnnnn,      

如何在文件 1 中创建一个新字段(例如 -f15),并将文件 2 中的 Normal_ID 值分配给新创建的文件 1 字段中相应的 Tumor_ID 值?我的问题有意义吗?

答案1

这是一个可行的解决方案,但可能需要进一步完善。

我删除了 file2 中的所有空格和制表符,以使数据逗号分隔。这可以很容易地完成

tr -d " " <file2 > file-b

我还在 file1(现在称为 file-a)中添加了一个新的占位符字段编号 5,其初始值为 NA

这可以通过以下方式完成

sed  's/$/\tN.A./' file1 > file-a

所以我们的新输入文件是:

$ cat file-a
Tumor_ID, Chromosome, start, end,       N.A.
xxxxx,       2,        12,    13,       N.A.
xxxxx,       3,        45,    46,       N.A.
xxxxx,       3,        48,    49        N.A.
xxxxx,       3,        51,    52,       N.A.
nnnnn,       5,       55,    59,        N.A.
nnnnn,       5,       57,    58,        N.A.
lllll,      11,       13,    14,        N.A.
lllll,      12,        16,    17,       N.A.
eeeee,       2,        51,    52,       N.A.
zzzzz,       9,      1000,   101,       N.A.

$ cat file-b
Patient_No.,Tumor_ID,Normal_ID,
4,xxxxx,hhhhh,
5,nnnnn,aaaaa,
8,lllll,ddddd,
7,eeeee,ggggg,
3,zzzzz,nnnnn,

实现目标的命令是:

$ while IFS="," read a b c;do sed -i "/${b}/{s/N.A./${c}/}" file-a;done <file-b

$ cat file-a
Tumor_ID, Chromosome, start, end,       Normal_ID
xxxxx,       2,        12,    13,       hhhhh
xxxxx,       3,        45,    46,       hhhhh
xxxxx,       3,        48,    49        hhhhh
xxxxx,       3,        51,    52,       hhhhh
nnnnn,       5,       55,    59,        aaaaa
nnnnn,       5,       57,    58,        aaaaa
lllll,      11,       13,    14,        ddddd
lllll,      12,        16,    17,       ddddd
eeeee,       2,        51,    52,       ggggg
zzzzz,       9,      1000,   101,       nnnnn

您可以使用自己合适的格式来美化输出。

答案2

我假设字段中的空格和尾随逗号是问题中的拼写错误。如果他们是实际上部分数据,然后用例如清理它们

mlr -I --csv -N clean-whitespace then remove-empty-columns file1.csv file2.csv

上面的命令使用磨坊主( mlr) 从每个字段的值中删除前导和尾随空格,将多个空格压缩为单个空格,然后删除最终为空的列。请注意,这是“就地”完成的,覆盖原始文件。-I如果您想保留原始文件,请删除该选项并重定向到新文件名。

这应该会产生两个文件file1.csv

Tumor_ID,Chromosome,start,end
xxxxx,2,12,13
xxxxx,3,45,46
xxxxx,3,48,49
xxxxx,3,51,52
nnnnn,5,55,59
nnnnn,5,57,58
lllll,11,13,14
lllll,12,16,17
eeeee,2,51,52
zzzzz,9,1000,101

... 和file2.csv

Patient_No.,Tumor_ID,Normal_ID
4,xxxxx,hhhhh
5,nnnnn,aaaaa
8,lllll,ddddd
7,eeeee,ggggg
3,zzzzz,nnnnn

Tumor_ID然后,您可以使用该字段作为连接键在这些之间执行关系连接操作:

$ mlr --csv join -f file1.csv -j Tumor_ID file2.csv
Tumor_ID,Chromosome,start,end,Patient_No.,Normal_ID
xxxxx,2,12,13,4,hhhhh
xxxxx,3,45,46,4,hhhhh
xxxxx,3,48,49,4,hhhhh
xxxxx,3,51,52,4,hhhhh
nnnnn,5,55,59,5,aaaaa
nnnnn,5,57,58,5,aaaaa
lllll,11,13,14,8,ddddd
lllll,12,16,17,8,ddddd
eeeee,2,51,52,7,ggggg
zzzzz,9,1000,101,3,nnnnn

删除不需要的Patient_No.字段是通过额外的cut操作完成的(子命令-x的选项cut表示“删除以”命名的字段-f):

$ mlr --csv join -f file1.csv -j Tumor_ID then cut -x -f Patient_No. file2.csv
Tumor_ID,Chromosome,start,end,Normal_ID
xxxxx,3,45,46,hhhhh
xxxxx,3,48,49,hhhhh
xxxxx,3,51,52,hhhhh
nnnnn,5,55,59,aaaaa
nnnnn,5,57,58,aaaaa
lllll,11,13,14,ddddd
lllll,12,16,17,ddddd
eeeee,2,51,52,ggggg
zzzzz,9,1000,101,nnnnn

我们可能不想删除不需要的字段,而是想准确地说出我们想要保留哪些字段以及以什么顺序。如果第二个文件有许多其他字段并且您想要Normal_ID从那里使用该字段,则这特别方便。下面子命令-o的选项指示不仅应该提取cut提到的字段-f,还应该按照提到的顺序排序。

mlr --csv join -f file1.csv -j Tumor_ID then cut -o -f Tumor_ID,Chromosome,start,end,Normal_ID file2.csv

相关内容