![使用 shell 脚本比较 2 个不同文件中的一对一行](https://linux22.com/image/46620/%E4%BD%BF%E7%94%A8%20shell%20%E8%84%9A%E6%9C%AC%E6%AF%94%E8%BE%83%202%20%E4%B8%AA%E4%B8%8D%E5%90%8C%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E4%B8%80%E5%AF%B9%E4%B8%80%E8%A1%8C.png)
我有两个文件:
File1 File2
abc abc
cde cde,xyz,efg,hij,...,n
efg lmn,opq,weq,...n
现在我想比较一下文件1行1和文件2第1行,第2行和第2行等等。但是,在 File2 中,单行可以包含多个以“逗号”分隔的条目。
现在如果输入文件1与任何相应的行条目匹配文件2结果应该没问题,否则显示差异。
例如:
File1 File2
cde cde,xyz,efg,hij,opt
结果应该没问题,因为cde
两个文件中都存在。
你能帮我写一个像 diff 给我的 shell 脚本吗,包括条目差异。
答案1
也许不是很漂亮,但这样的事情可能是一个开始:
# 1. Read lines from file1 as string, and file2 as comma-separated array.
while read -r a && IFS=, read -ra b <&3; do
# 2. If both empty lines, continue.
if [[ "$a" == "" && ${#b[@]} == 0 ]]; then
continue
fi
# 3. Start assuming diff.
diff=1
# 4. Loop fields in $b.
for e in ${b[@]}; do
# Compare field in $b with $a, if match then abort.
if [[ "$e" == "$a" ]]; then
diff=0
break
fi
done
# 5. If no match found, print line from $b.
if [[ $diff == 1 ]]; then
# Join array with <space>comma.
line=$(printf ", %s" "${b[@]}")
# Print line, excluding leading <space>comma.
printf "%s\n" "${line:2}"
fi
# Input argument one as file 1 to stdin, and argument two as file 2 to
# file descriptor 3.
done < "$1" 3<"$2"
通常用作:
$ ./myscript file1 file2
现在使用 Python、Perl、awk 等可能会更好。
答案2
答案3
尝试:
paste file1 file2 | grep -vP '^(.*)\t.*\1.*'
并可能根据您的情况调整正则表达式。
答案4
使用 GNU awk,您可以一行完成:
awk '{a=$0;getline <File2;if($0 ~ a)print "OK"; else print a,$0}' File1