我有两个文本文件:
FILE1.TXT
dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
fdf 767 4643 {"klhf":"3455" kgs:"4566"}
.
.
FILE2.TXT
8853
6437437567
36265
4566
.
.
输出可以是两个文件
Match.txt
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
fdf 767 4643 {"klhf":"3455" kgs:"4566"}
Non_Match.txt
dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
有人可以帮我写这个bash脚本吗?
我认为如果它有帮助,我在这里有逻辑:
for (rows in File1.txt) {
bool found = false;
for (id in File2.txt) {
if (row contains id) {
found = true;
echo row >> Match.txt
break;
}
}
if (!found) {
echo row >> Non_Match.txt
}
}
编辑部分:
我也有一个bash脚本,但它没有帮助,因为它没有放置匹配的行,而只是匹配的ID ..
#!/bin/bash
set -e
file1="File2.txt"
file2="File1.txt"
for id in $(tail -n+1 "${file1}"); do
if ! grep "${id}" "${file2}"; then
echo "${id}" >>non_matches.txt
else
echo "${id}" >>matches.txt
fi
done
答案 0 :(得分:5)
您可以使用grep -f
查找单独文件中列出的搜索模式。使用-F
(固定字符串)和-w
(匹配整个单词)标记可能也不错。
grep -Fw -f File2.txt File1.txt > Match.txt
grep -Fwv -f File2.txt File1.txt > Non_Match.txt
答案 1 :(得分:1)
如果您想在字词级别执行此操作,这听起来有点像diff
或wdiff
。
如果您在两个文件上运行diff
,则会生成以下输出:
< dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
< gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
< fdf 767 4643 {"klhf":"3455" kgs:"4566"}
---
> 8853
> 6437437567
> 36265
> 4566
这意味着&#34; minimal&#34;方式(每行)将第一个文件修改为第二个文件,删除所有行并添加所有新行。
但是,如果第二个文件是:
8853
6437437567
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
36265
4566
diff
输出为:
1c1,2
< dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}
---
> 8853
> 6437437567
3c4,5
< fdf 767 4643 {"klhf":"3455" kgs:"4566"}
---
> 36265
> 4566
所以diff
不再要求删除第二行。
wdiff
大致相同,但在字层上:
[-dadads 434 43 {"4fsdf":"66db1" fdf1:"5834"}-]{+8853
6437437567+}
gsgss 45 0 {"gsdg":"8853" sgdfg:"4631"}
[-fdf 767 4643 {"klhf":"3455" kgs:"4566"}-]
{+36265
4566+}