逐行比较 2 个文件的脚本
Script to compare 2 files line by line
我有两个文本文件:
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"}
非_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
您可以使用 grep -f
来查找列在单独文件中的搜索模式。也可以使用 -F
(固定字符串)和 -w
(匹配整个单词)标志。
grep -Fw -f File2.txt File1.txt > Match.txt
grep -Fwv -f File2.txt File1.txt > Non_Match.txt
这听起来有点像 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
这意味着将第一个文件修改为第二个文件的"minimal"方式(根据行)是删除所有行并添加所有新行。
如果第二个文件是:
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+}
我有两个文本文件:
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"}
非_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
您可以使用 grep -f
来查找列在单独文件中的搜索模式。也可以使用 -F
(固定字符串)和 -w
(匹配整个单词)标志。
grep -Fw -f File2.txt File1.txt > Match.txt
grep -Fwv -f File2.txt File1.txt > Non_Match.txt
这听起来有点像 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
这意味着将第一个文件修改为第二个文件的"minimal"方式(根据行)是删除所有行并添加所有新行。
如果第二个文件是:
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+}