如何在 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/