如何在unix中从多个txt文件复制唯一列以形成一个新的txt文件
How to copy unique columns from multiple txt files to form one new txt file in unix
我有三个 .txt 文件(制表符分隔)
FileA.txt
Data_ID sample_ID
2253791 20481
2253793 20483
2253798 20488
FileB.txt
Subject_ID age sex smok
1869793 11 2 1
1869585 7 1 3
1870238 9 2 1
FileC.txt
Subject_ID Data_ID
1869793 2253798
1869585 2253793
1870238 2253791
我想合并这三个文件,使我的 output.txt
包含三个文件的所有唯一列,如下面的
Subject_ID Data_ID sample_ID age sex smok
1869793 2253798 20481 11 2 1
1869585 2253793 20483 7 1 3
1870238 2253791 20488 9 2 1
我试过 paste
如下,但它不起作用。我哪里做错了?还有其他一些带有粘贴或 awk
的解决方案吗?
paste <(awk '{print "\t"}' FileA.txt)\
<(awk '{print }' FileC.txt)\
<(awk '{print "\t""\t""}' FileC.txt)\
> output.txt
没有顺序或任何关系的输出:
1,"}'
有一个额外的"
,应该在你的命令中删除它。
2、最后的FileC.txt应该改成FileB.txt.
3、粘贴following but its not working
的代码可能格式有误?你能上传一张截图吗?
4、只合并没有判断关系的列?
如果是,试试这个(只有一些格式被你的代码固定为一行):
paste <(awk '{print "\t"}' FileC.txt) <(awk '{print }' FileA.txt) <(awk '{print "\t""\t"}' FileB.txt) > output.txt
在我编辑你的问题之前得到你想要的:
$ cat output.txt
Subject_ID Data_ID sample_ID age sex smok
1869793 2253798 20481 11 2 1
1869585 2253793 20483 7 1 3
1870238 2253791 20488 9 2 1
输出顺序和关系:
join -1 2 -2 1 <(join -1 2 -2 1 <(sort -k2 FileC.txt) <(sort -k1 FileA.txt) | sort -k2) <(sort -k1 FileB.txt) | tac | awk 'NR==1 {line=[=12=]; next} 1; END{print line}' | tac
得到输出:
Subject_ID Data_ID sample_ID age sex smok
1869585 2253793 20483 7 1 3
1869793 2253798 20488 11 2 1
1870238 2253791 20481 9 2 1
1、使用join
将两个文件的行按sort
.
的同一列合并
2、使用tac file | awk 'NR==1 {line=[=19=]; next} 1; END{print line}' | tac
将页眉移动到顶部。
我有三个 .txt 文件(制表符分隔)
FileA.txt
Data_ID sample_ID
2253791 20481
2253793 20483
2253798 20488
FileB.txt
Subject_ID age sex smok
1869793 11 2 1
1869585 7 1 3
1870238 9 2 1
FileC.txt
Subject_ID Data_ID
1869793 2253798
1869585 2253793
1870238 2253791
我想合并这三个文件,使我的 output.txt
包含三个文件的所有唯一列,如下面的
Subject_ID Data_ID sample_ID age sex smok
1869793 2253798 20481 11 2 1
1869585 2253793 20483 7 1 3
1870238 2253791 20488 9 2 1
我试过 paste
如下,但它不起作用。我哪里做错了?还有其他一些带有粘贴或 awk
的解决方案吗?
paste <(awk '{print "\t"}' FileA.txt)\
<(awk '{print }' FileC.txt)\
<(awk '{print "\t""\t""}' FileC.txt)\
> output.txt
没有顺序或任何关系的输出:
1,"}'
有一个额外的"
,应该在你的命令中删除它。
2、最后的FileC.txt应该改成FileB.txt.
3、粘贴following but its not working
的代码可能格式有误?你能上传一张截图吗?
4、只合并没有判断关系的列?
如果是,试试这个(只有一些格式被你的代码固定为一行):
paste <(awk '{print "\t"}' FileC.txt) <(awk '{print }' FileA.txt) <(awk '{print "\t""\t"}' FileB.txt) > output.txt
在我编辑你的问题之前得到你想要的:
$ cat output.txt
Subject_ID Data_ID sample_ID age sex smok
1869793 2253798 20481 11 2 1
1869585 2253793 20483 7 1 3
1870238 2253791 20488 9 2 1
输出顺序和关系:
join -1 2 -2 1 <(join -1 2 -2 1 <(sort -k2 FileC.txt) <(sort -k1 FileA.txt) | sort -k2) <(sort -k1 FileB.txt) | tac | awk 'NR==1 {line=[=12=]; next} 1; END{print line}' | tac
得到输出:
Subject_ID Data_ID sample_ID age sex smok
1869585 2253793 20483 7 1 3
1869793 2253798 20488 11 2 1
1870238 2253791 20481 9 2 1
1、使用join
将两个文件的行按sort
.
2、使用tac file | awk 'NR==1 {line=[=19=]; next} 1; END{print line}' | tac
将页眉移动到顶部。