如何在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将页眉移动到顶部。