Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 比较并并排显示两个文件_Linux_Bash_Shell_Unix_Awk - Fatal编程技术网

Linux 比较并并排显示两个文件

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

如何将两个文本文件中的数据与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-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