linux - 并排比较并显示两个文件

标签 linux bash shell unix awk

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

示例:

$cat A.txt  
FName   User1  
EmpID   1234  
Mobile1 000-000-000  
EMail   <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="40353325327100212f2c6e232f2d" rel="noreferrer noopener nofollow">[email protected]</a>


$cat B.txt
FName   User2
LName   LastName  
EmpID   2345  
Phone   00-1234567  
EMail   <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0673756374344667696a2865696b" rel="noreferrer noopener nofollow">[email protected]</a> 

结果应该是这样的

FName   User1           User2
LName                   LastName
EmpID   1234            2345
Mobile1 000-000-000     
Phone                   00-1234567
EMail   <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="deabadbbacef9ebfb1b2f0bdb1b3" rel="noreferrer noopener nofollow">[email protected]</a>   <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97e2e4f2e5a5d7f6f8fbb9f4f8fa" rel="noreferrer noopener nofollow">[email protected]</a>   

我尝试过使用pr -m -t A.txt B.txt,它的输出将文件内容合并为一。

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

任何人都可以帮助我或者对此提供一些想法吗?

谢谢,
瓦尔丹

最佳答案

这是一般方法:

$ 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     <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="285d5b4d5a1968494744064b4745" rel="noreferrer noopener nofollow">[email protected]</a>  <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="abded8ced999ebcac4c785c8c4c6" rel="noreferrer noopener nofollow">[email protected]</a>
EmpID     1234           2345
FName     User1          User2

您需要提供脚本如何知道在“LName”之前输出“FName”、“Mobile1”在“Phone”之前而不是在“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

关于linux - 并排比较并显示两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27041568/

相关文章:

linux - 如何知道进程是bash,linux中的用户还是root

linux - 在每个数据包之间引入延迟

bash - 使用 tac combo sed/awk/grep/? 提取最后 5 分钟的系统日志数据 (750mb)

python - 多个进程读取和删除同一目录中的文件

bash shell 重做变量用下划线替换点

linux - 我怎样才能显示正确答案?

linux - 如何在使用 SVN :SSH method 时制作 SVN 提交后 Hook

bash - 将证书从环境变量传递给curl

arrays - 为什么我的 bash shell 脚本在 v 3.2.5 上运行而在 4.1.2 上运行失败?

linux - 如何使用本地参数运行远程 bash 脚本