如果没有结果,如何停止grep创建空文件

时间:2017-08-29 18:03:56

标签: bash grep

我使用grep -v -f file1.txt file2.txt > result.txt

比较两个文件的结果,而不是另一个文件中的行

让我们说我的文件看起来像;

FILE1.TXT

alex
peter
zoey

FILE2.TXT

alex
john
peter
zoey

因此result.txt应包含john

这将在Jenkins工作中运行,如果两者之间没有差异,jenkins最终不满意创建空result.txt

我不能做一个盲目差异/无差异输出,我特别需要知道哪些行有差异。

如果没有结果,是否有更简洁的方法来运行此命令以不创建文件?

5 个答案:

答案 0 :(得分:5)

如果文件是空的,你可以做一些简单的删除文件吗?

解决方案#1:

grep -v -f file1.txt file2.txt > result.txt
[[ $? -ne 0 ]] && 'rm' -f result.txt
  • grep应该为空输出生成非零返回码
  • 引用rm命令以确保不调用任何别名
  • 使用-f保持文件不存在时的任何消息都是静默的(不应该发生,但不会对此代码造成伤害)

解决方案#2:

grep -v -f file1.txt file2.txt > result.txt
[[ ! -s result.txt ]] && 'rm' -f result.txt
  • -s =>文件存在且大小大于0
  • ! -s =>文件不存在或文件存在且大小为0
  • 'rm' -f ...与解决方案#1相同的解释

答案 1 :(得分:3)

您可以使用此use xyz4digit.dbf Append from S:/file location Append from S:/2 - file location 创建条件差分输出文件:

awk

仅当由于awk 'NR==FNR{a[$1]; next} !($1 in a){b[$1]} END{ if (length(b) > 0) for (i in b) print i > "result.txt"}' file1.txt file2.txt 检查而要写入任何输出数据时,才会创建输出文件result.txt

答案 2 :(得分:2)

编辑:尝试使用安静选项-q有条件地运行命令(当找到一个匹配时将退出并节省时间)。然后,一旦找到第一个匹配项(意味着文件不同),您将运行相同的命令并将其输出到您的文件。

试试这个:(编辑来自Charles Duffy的评论)

#!/usr/bin/env bash

if grep -qvf file1.txt file2.txt 
then
   grep -vf file1.txt file2.txt > output.txt
   echo "Differences exist. File output.txt created." 
else
   echo "No difference between the files detected"
fi

或者使用更少的代码和一行:

grep -qvf file1.txt file2.txt && grep -vf file1.txt file2.txt > output.txt

答案 3 :(得分:2)

这应该适合您的情况

out=$(grep -v -f file1.txt file2.txt); [[ -n "$out" ]] && echo "$out" > results.txt

答案 4 :(得分:0)

使用=ISNUMBER(SEARCH("Perso",$A2)) 。积极的结果:

grep && grep

和否定:

$ grep -q -m 1 -v -f file1 file2 && grep -v -f file1 file2 > out1 
$ cat out1
john

它在第一次匹配后退出第一个$ grep -q -m 1 -v -f file1 file1 && grep -v -f file1 file1 > out2 $ cat out2 cat: out2: No such file or directory 以加快其执行速度,但最差的执行时间仍然是一个grep的运行时间的两倍。

另一种方式,另一种方法:

grep

awk不会识别部分匹配。