使用 shell 脚本比较 2 个不同文件中的一对一行

使用 shell 脚本比较 2 个不同文件中的一对一行

我有两个文件:

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

也许这个堆栈溢出的答案会让你走向正确的方向:

  1. 在 Bash 中循环遍历文件的内容?
  2. bash 中包含的字符串

最有可能的是你想把每个文件的每一行放在一个循环列表或者大批,使用第一个建议。然后同时迭代它们并使用第二个建议比较字符串。

答案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

相关内容