如何在unix中从多个txt文件中复制唯一列以形成一个新的txt文件



我有三个.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 $1"t"$2}' FileA.txt)
<(awk '{print $1}' FileC.txt)  
<(awk '{print $2"t"$3"t"$4"}' FileC.txt) 
> output.txt

无订单或任何关系的输出:

1,$4"}'有一个额外的",应该在您的命令中删除它。

2,最后一个FileC.txt应该更改FileB.txt

3,粘贴following but its not working的代码可能有一些错误格式?你能上传一张截图吗?

4、只合并列,没有什么关系判断?

如果是,试试这个(只有一些格式被你的代码固定为一行(:

paste <(awk '{print $1"t"$2}' FileC.txt) <(awk '{print $2}' FileA.txt)  <(awk '{print $2"t"$3"t"$4}' 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=$0; 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=$0; next} 1; END{print line}' | tac将收割台移动到顶部。

最新更新