并排比较并显示两个文件

时间:2014-11-20 14:06:50

标签: linux bash shell unix awk

如何在Shell中比较和打印两个文本文件中的数据。 让我们举两个例子A.txt和B.txt

示例:

$cat A.txt  
FName   User1  
EmpID   1234  
Mobile1 000-000-000  
EMail   user1@aol.com


$cat B.txt
FName   User2
LName   LastName  
EmpID   2345  
Phone   00-1234567  
EMail   user2@aol.com 

,结果应该像

FName   User1           User2
LName                   LastName
EmpID   1234            2345
Mobile1 000-000-000     
Phone                   00-1234567
EMail   user1@aol.com   user2@aol.com   

我尝试过使用pr -m -t A.txt B.txt,并且它的输出正在将文件内容添加到一个。

还尝试使用sdiff但无法获得输出

可以帮助我,或者对此有所了解。

谢谢,
Vardhan

4 个答案:

答案 0 :(得分:2)

以下是一般方法:

$ cat tst.awk
NR==FNR{ a[$1] = $2; next }
{ a[$1]; b[$1] = $2 }
END {
    for (key in a) {
        printf "%-10s%-15s%-15s\n", key, a[key], b[key]
    }
}

$ awk -f tst.awk A.txt B.txt
LName                    LastName
Phone                    00-1234567
Mobile1   000-000-000
EMail     user1@aol.com  user2@aol.com
EmpID     1234           2345
FName     User1          User2

您需要提供脚本如何知道输出的逻辑" FName"之前" LName"," Mobile1"来自而不是之后#34;电话"如果你关心它,你的输出中的其他字段的顺序。一种可能性是对密钥进行硬编码:

$ cat tst.awk
BEGIN{ split("FName LName EmpID Mobile1 Phone Email", keys) }
NR==FNR{ a[$1] = $2; next }
{ b[$1] = $2 }
END {
    for (keyNr=1; keyNr in keys; keyNr++) {
        key = keys[keyNr]
        printf "%-10s%-15s%-15s\n", key, a[key], b[key]
    }
}

$ awk -f tst.awk A.txt B.txt
FName     User1          User2
LName                    LastName
EmpID     1234           2345
Mobile1   000-000-000
Phone                    00-1234567
Email

答案 1 :(得分:1)

你几乎可以这样做:

join -a 1 -a 2 A.txt B.txt

但是你失去了一些空间。尝试:

{ join A.txt B.txt; 
join -v 2 A.txt B.txt | awk '{print $1, ".", $2}';
join -v 1 A.txt B.txt; } | column -t

答案 2 :(得分:0)

使用awk,您可以获得可以根据需要格式化的csv文件

% fieldjoin () { awk '
    NR==FNR{val[$1]=$2",";next}
           {if($1 in val){
             val[$1]=val[$1] $2} else {
             val[$1]=","$2}}
    END {for(k in val) print k "," val[k]}' "$1" "$2" ; }
% fieldjoin A.txt B.txt
LName,,LastName
Phone,,00-1234567
Mobile1,000-000-000,
EMail,user1@aol.com,user2@aol.com
EmpID,1234,2345
FName,User1,User2
% 

答案 3 :(得分:0)

你可以cut出你想要的东西& paste a.txt b.txt在一起。

man cut& man paste了解更多详情。