我在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