gpt4 book ai didi

linux - 比较 2 个文件时进行 Bash shell 脚本检查

转载 作者:太空宇宙 更新时间:2023-11-04 05:28:09 24 4
gpt4 key购买 nike

我有2个文件

文件1

abc

cde

efg

hij

jkl

文件2

abc

( * ) ( * ) ( * ) -- without the braces

efg

(*) hij -- without braces

(*) (*) lmn --- without braces

现在,逐行比较两个文件,即仅将 file1 的第一行与 file2 的第一行进行比较

abc ---- abc

cde ---- * * *

当遇到 * * * 时,比较应移动到下一行来比较其他行

但是,在比较时

hij --- (*) hij  or jkl --- (*) (*) lmn

hij 必须与 File2 的 hij 进行比较,并且必须给出 ok并且,jkl 必须与 lmn 进行比较,并且必须给出 not ok :在任一情况下忽略 ** *

我已经为相同的比较 2 个文件编写了脚本,但是我无法检查 *

你能帮我解决同样的问题吗

比较文件的脚本片段

# 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"

最佳答案

您的脚本已正确处理单星号和双星号的情况。回想一下,您的脚本假定 diff=1,并且仅在找到匹配项时才更改为 diff=0。由一个星号组成的 ${b[@]} 元素与 file1 中的输入行比较不相等,这意味着这些元素正确地保持了原始假设 (diff=1) 不变。但是,如果 file1 中的输入行仅包含一个星号,则比较将导致匹配并设置 diff=0。但这样 file2 中单个星号的含义就会变得有些模糊;它的意思是“匹配 file1 中的文字单星号行”,还是意味着“不匹配 file1 中的任何行”?后一种含义似乎就是您希望 file2 中的星号表示的含义。如果您希望在这种奇怪的情况下保留这种含义,则必须添加显式测试以跳​​过 file2 中的星号单词:

if [[ "$e" == '*' ]]; then continue; fi;

此测试将在 for 循环开始时进行。

关于三个星号的情况,听起来您想完全跳过该情况。正如我上面所描述的,当前 file2 中的单星号元素被隐式跳过(因为它们与 file1 中的任何输入行都不匹配),这使得 diff=1,并导致打印 * * * 消息。为了防止这种情况,您可以添加针对 * * * 的显式防护,如下所示:

if [[ ${#b[@]} -eq 3 && "${b[0]}" == '*' && "${b[1]}" == '*' && "${b[2]}" == '*' ]]; then continue; fi;

此测试将在空行检查之后,在 while 循环的开头附近进行。

关于linux - 比较 2 个文件时进行 Bash shell 脚本检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28021040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com