Linux按列合并两个文件 [英] Linux Combine two files by column

查看:1273
本文介绍了Linux按列合并两个文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想两个文件合并如下(路口)

  ID名称电话
约翰一书011
2萨姆013
3耶拿014
4彼得·015

第二个文件的test2.txt

  1的Test1的Test2
2 Test3的TEST4
3 TEST5 TEST6
4 TEST7 Test8
5 TEST7 Test8
6 TEST7 Test8
7 TEST7 Test8
8 TEST7 Test8
9 TEST7 Test8

然后最终结果。

  ID名称备注1电话备注2
约翰一书011的Test1的Test2
撒下013 Test3的TEST4
3耶拿014 TEST5 TEST6
4彼得·015 TEST7 Test8

我不喜欢这样,如下,

 的awk -F\\ t的'
    {键= $ 1}
    NR == 1 {头=键}
    !(在结果键){导致[关键] = $ 0;下一个}
    {为(i = 2; I< = NF;我++)结果[关键] =结果[关键] FS $ I}
    结束 {
        打印结果[标题]
        删除结果[标题]
        PROCINFO [sorted_in] =@ind_str_asc
        对(在结果键)打印结果[关键]
    }
个Test1.txt的test2.txt>的Result.txt

我只是注意到,这是联盟成立。
包括所有数据TEST1和Test2的。

我想只显示路口情况正如我预期的结果。
(1,2,3,4)只

难道你们有什么想法?谢谢!


解决方案

  $ AWK -v OFS ='\\ t''
NR == 1 {打印$ 0备注1,备注2;下一个 }
NR == FNR {a [$ 1] = $ 0;下一个 }
$ 1的{打印[$ 1],$ 2,$ 3}
个Test1.txt的test2.txt
ID名称备注1电话备注2
约翰一书011的Test1的Test2
撒下013 Test3的TEST4
3耶拿014 TEST5 TEST6
4彼得·015 TEST7 Test8

I am trying to combine two files as below (Intersection)

ID     Name  Telephone       
1      John     011
2      Sam      013
3      Jena     014
4      Peter    015

Second file Test2.txt

1       Test1    Test2
2       Test3    Test4
3       Test5    Test6
4       Test7    Test8
5       Test7    Test8
6       Test7    Test8
7       Test7    Test8
8       Test7    Test8
9       Test7    Test8

Then Final result

ID     Name  Telephone    Remark1  Remark2
1      John    011        Test1    Test2
2      Sam     013        Test3    Test4
3      Jena    014        Test5    Test6
4      Peter   015        Test7    Test8

I did like this as below,

awk -F"\t" '
    {key = $1 }
    NR == 1 {header = key}
    !(key in result) {result[key] = $0; next}
    { for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
    END {
        print result[header]
        delete result[header]
        PROCINFO["sorted_in"] = "@ind_str_asc"    
        for (key in result) print result[key]
    }
' Test1.txt Test2.txt > result.txt

And I just notice that this is Union set. Including all data Test1 and Test2.

I would like to show only for Intersection case as what I expected result. (1, 2 ,3 ,4) only

Do you guys have any idea? Thanks!

解决方案

$ awk -v OFS='\t' '
NR==1   { print $0, "Remark1", "Remark2"; next }
NR==FNR { a[$1]=$0; next }
$1 in a { print a[$1], $2, $3 }
' Test1.txt Test2.txt
ID     Name  Telephone  Remark1 Remark2
1      John     011     Test1   Test2
2      Sam      013     Test3   Test4
3      Jena     014     Test5   Test6
4      Peter    015     Test7   Test8

这篇关于Linux按列合并两个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆