Linux 比较并并排显示两个文件
如何将两个文本文件中的数据与Shell中的一个进行比较和打印。 让我们举两个例子A.txt和B.txt 例如:Linux 比较并并排显示两个文件,linux,bash,shell,unix,awk,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
$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-ta.txt B.txt
,它的输出是将文件内容合并成一个
还尝试使用sdiff,但无法获得输出
有谁能帮我一下,或者给我一些建议
谢谢,瓦尔丹你几乎可以做到:
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
以下是一般方法:
$ 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
您需要提供脚本如何知道在“LName”之前输出“FName”、“Mobile1”在“Phone”之前而不是之后的逻辑,以及输出中其他字段的顺序(如果您关心这一点)。一种可能是硬编码钥匙:
$ 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
使用
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
%
您只需
剪切
出所需内容&将a.txt b.txt
粘贴在一起即可
mancut
和manpaste
了解更多详细信息。diff-y A.txt B.txt是否适合您?相关:A[$1]代码>如果项不存在,是否将键放入关联数组?(是的)别想了,很高兴知道!是的。这就是为什么当您想要测试数组中存在的键时,您需要使用if(数组中的键)
而不是if(数组[key])
,因为(在其他问题中)后者会将key
添加到array
中,如果它不存在,那么后面的会添加到for(数组中的键)
循环将有不希望的行为。如果两个不同的文件中有6列,则需要进行哪些更改。。正在等待您的更新。。谢谢@Edmorton这可能意味着几件事。发布带有示例输入和预期输出的新问题。发布新问题。。我看到你删除了你的评论。。。如果您是在我的评论之后这样做的,我很抱歉,因为您关于最后一条记录的可用性和POSIX规范本身是有用的。总结Ed删除的评论:(1)不是所有的awk
实现在执行END
子句中的代码时都会给您$0
,$1
等(2)POSIX限制自己要求END
正文中提供NR
。