如何使用IF / Then Bash命令比较2个文件中的行数

时间:2017-10-11 02:12:10

标签: linux bash unix if-statement wc

我想比较两个单独文件的行数。虽然我在比较中尝试使用g3 = subtract (g1, g2); should return {"a", "c"); g4 = subtract (g2, g1); should return {"d", "e"); ,但我很难让它正常运行。

我有:

wc -l

但是,if / then语句不会返回正确的输出。

如果文件1和2具有相同的行数,那么编写此代码的正确方法是什么?

FILE1.TXT:

if [ "$(wc -l file1.txt)" == "$(wc -l file2.txt)" ]; then echo "Warning: No Match!"; fi

FILE2.TXT:

example1
example2
example3

更新:我们发现example4 example5 example6 命令必须只返回一个数字用于比较。与问题Why should there be a space after '[' and before ']' in Bash?不同,此问题需要使用wc -l来获取一个整数,该整数可以与单独文件中的行数进行比较。

2 个答案:

答案 0 :(得分:4)

请您试着跟随并告诉我这是否对您有帮助。

if [ "$(wc -l < file1.txt)" -eq "$(wc -l < file2.txt)" ]; then echo 'Match!'; else echo 'Warning: No Match!'; fi

上述代码示例: 我们假设我们有以下Input_files:

cat file1.txt
I
am
Cookie

cat file2.txt

I
am
Cookie

现在我们可以看到两个文件中的行数不相等,因此会出现以下结果。

if [ "$(wc -l < file1.txt)" -eq "$(wc -l < file2.txt)" ]; then echo 'Match!'; else echo 'Warning: No Match!'; fi
Warning: No Match!

现在,如果我们现在使文件的两行等于如下。

cat file1.txt
I
am
Cookie
cat file2.txt
I
am
Cookie

现在,当我们运行相同的代码时,它将给出如下。

if [ "$(wc -l < file1.txt)" -eq "$(wc -l < file2.txt)" ]; then echo 'Match!'; else echo 'Warning: No Match!'; fi
Match!

答案 1 :(得分:1)

您需要在括号和比较表达式之间留一个空格:

if [ <expression> ]; then echo "Then Do Something"; fi

所以在你的情况下,它将是:

if [ "$(wc -l file1.txt)" -eq "$(wc -l file2.txt)" ]; then echo "Warning: No Match!"; fi