Linux按列合并两个文件

时间:2014-09-03 19:28:13

标签: linux bash shell awk sed

我正在尝试将两个文件组合在一起(交集)

ID     Name  Telephone       
1      John     011
2      Sam      013
3      Jena     014
4      Peter    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     Name  Telephone    Remark1  Remark2
1      John    011        Test1    Test2
2      Sam     013        Test3    Test4
3      Jena    014        Test5    Test6
4      Peter   015        Test7    Test8

我确实如下所示,

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

我只是注意到这是Union set。 包括所有数据Test1和Test2。

我想仅针对交叉口案例展示我期望的结果。 (1,2,3,4)仅

你们有什么想法吗?谢谢!

4 个答案:

答案 0 :(得分:23)

使用join命令要容易得多:

$ cat a.txt 
ID     Name  Telephone       
1      John     011
2      Sam      013
3      Jena     014
4      Peter    015
$ cat b.txt 
ID     Remark1  Remark2       
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
$ join a.txt b.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

使用column命令打印它:

$ join a.txt b.txt | column -t
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

答案 1 :(得分:5)

$ 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

答案 2 :(得分:2)

另一个替代方案是pr,用于格式化要打印的文件。

$ pr -tm -w 50 Test1.txt Test2.txt
ID     Name  Telephone   ID Remark1  Remark2
1      John      011     1   Test1    Test2
2      Sam       013     2   Test3    Test4
3      Jena      014     3   Test5    Test6
4      Peter     015     4   Test7    Test8
                         5   Test7    Test8
                         6   Test7    Test8
                         7   Test7    Test8
                         8   Test7    Test8
                         9   Test7    Test8

最重要的是m标志,它将文件合并到列中。 t标志会删除页眉和页脚 - 因为我们不打算在纸上打印,所以我们不需要它们。最后一个w标志用于设置宽度。

答案 3 :(得分:1)

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