![一行代码判断两个文件的第一行是否相同](https://linux22.com/image/531974/%E4%B8%80%E8%A1%8C%E4%BB%A3%E7%A0%81%E5%88%A4%E6%96%AD%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E7%AC%AC%E4%B8%80%E8%A1%8C%E6%98%AF%E5%90%A6%E7%9B%B8%E5%90%8C.png)
是否可以简单使用 head 和 cmp(或其他方式)来实现这一点?
答案1
diff
您可以使用进程替换的退出状态head
:
[kbrandt@localhost ~]$ echo arf > foo
[kbrandt@localhost ~]$ echo arf > foo1
[kbrandt@localhost ~]$ diff <(head -n1 foo) <(head -n1 foo1)
[kbrandt@localhost ~]$ echo $?
0
[kbrandt@localhost ~]$ echo foo > foo1
[kbrandt@localhost ~]$ diff <(head -n1 foo) <(head -n1 foo1)
1c1
< arf
---
> foo
[kbrandt@localhost ~]$ echo $?
1
[kbrandt@localhost ~]$
Diff 比较文件,如果退出状态为零,则文件匹配。非零表示它们不匹配,或者运行 diff 时出现错误,这似乎不太可能。是一个 shell 变量,它具有前一个命令的退出状态。如果您不想在屏幕上看到$?
diff 的输出,可以通过在 diff 命令末尾添加以下内容来重定向 diff 的输出:> /dev/null
[kbrandt@localhost ~]$ diff <(head -n1 foo) <(head -n1 foo1) > /dev/null
[kbrandt@localhost ~]$ echo $?
1
答案2
以下是在 Bash 中执行此操作的一种方法,无需调用三次外部实用程序。它也适用于没有进程替换的 POSIX shell:
read a<file1; read b<file2; [ "$a" = "$b" ]; echo $?
以下是使用 AWK 的另一种方法:
awk 'FNR==1{a[NR]=$0; if (NR==2) exit a[1]!=a[2]; nextfile}' file1 file2
请注意,AWK 比较返回 1 表示真,因此我使用!=
0,这样 shell 就会得到它认为是真的。