测试另一个文件中是否存在一个文件的所有内容



我在stackoveflow上找到了一些关于如何做到这一点的例子,但没有一个对我有用。

bash 文本搜索:查找一个文件的内容是否存在于另一个文件中

我想测试一个文本文件的所有内容是否以相同的格式/块/样式存在于第二个文件中的某个地方,如果不添加 SRC>> $TGT的内容。

如果我在控制台中手动执行这些命令,则返回$SRC的内容:

SRC="mytextfile1.txt"
TGT="mytextfile2.txt"
grep -F -f $SRC $TGT
cat $TGT|grep -f $SRC

这不会返回任何内容:

grep $SRC -q -f $TGT

每次执行时都会不断追加:

function append {
f1=$(wc -c < "$SRC")
diff  -y <(od -An -tx1 -w1 -v "$SRC") <(od -An -tx1 -w1 -v "$TGT") | 
rev | cut -f2 | uniq -c | grep -v '[>|]' | numgrep /${f1}../ | 
grep -q -m1 '.+*' || cat "$SRC" >> "$TGT";
}

那么我该怎么做才能在 if 语句中对其进行测试呢?!

编辑

下面是文件内容的示例:

$SRC文件

text 1
text 2
text d
text e
text f
text g

修改前$TGT文件

text 1
text 2
text 3
text 4
text a
text b
text c

修改后的$TGT文件

text 1
text 2
text 3
text 4
text a
text b
text c
text 1
text 2
text d
text e
text f
text g

我会使用 perl 的index

if ! perl -0 -we '
open my $f1, "<", "mytextfile1.txt";
open my $f2, "<", "mytextfile2.txt"; 
exit( index(<$f2>, <$f1>) == -1 )' 
then
cat mytextfile1.txt >> mytextfile2.txt
fi

这里的键是-0,这使得<>运算符读取整个文件,而不仅仅是一行。请注意,逻辑有点复杂。 如果index返回 -1,则内容不匹配,perl 返回非零,shell 将其视为失败。 所以 if 条件是反转的。 当内容匹配时,perl 成功似乎更自然,但也许使用!=并删除外部反转会更干净。

您能否根据您的逻辑尝试以下操作(OP 在评论中解释,Input_file src 的所有内容都应以相同的顺序出现在 Input_file tgt( 中(尝试以下。

awk '
FNR==NR{
a[FNR,$0]
val1=(val1?val1 ORS:"")$0
next
}
((FNR,$0) in a){
count++
val2=(val2?val2 ORS:"")$0
}
END{
if(count==length(a)){
print val1 ORS val2
}
}
'  file_src file_tgt

相关内容

最新更新