如何在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
答案 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
了解更多详情。