我使用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
。
我不能做一个盲目差异/无差异输出,我特别需要知道哪些行有差异。
如果没有结果,是否有更简洁的方法来运行此命令以不创建文件?
答案 0 :(得分:5)
如果文件是空的,你可以做一些简单的删除文件吗?
解决方案#1:
grep -v -f file1.txt file2.txt > result.txt
[[ $? -ne 0 ]] && 'rm' -f result.txt
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不会识别部分匹配。