防止向文件多次追加数据

3
什么是使用Bash脚本检查一个文件是否已经被多次追加到另一个文件中的最佳方法?我需要在不安装额外工具的情况下完成此操作。我通过将一个文件追加到另一个文件来定期更新一个文件,并希望确保此操作之前没有发生过。
我尝试了各种diff和wc解决方案,但都找不到解决方案。

当你进行追加操作时,插入一条包含有助于确定的信息的分隔线是否可以?具体来说,您如何尝试(并失败)进行检查? - mklement0
diff a.csv b.csv | sed -e '1d' -e 's/^..//g' | diff - a.csv | sed -e '1d' -e 's/^..//g' | diff - b.csv 是一种方法。 $1,$2是文件参数 L1 = $(diff $1 $2 | sed -e '1d' -e 's/^..//g' | wc -l | awk '{print $1}') L2 = $(wc -l $2 | awk '{print $1}') L3 = $(wc -l $1 | awk '{print $1}')如果 [ $(( $L1 + $L3 )) -ne $L2 ]; 然后 echo "在 $1 上的差异失败" exit 1; fi 是另一种方法。 此文件用于其他系统的读取,因此添加分隔线可能会很困难。对于我的糟糕的bash脚本技能,我感到抱歉。 - SMC
请使用```(反引号)将代码片段括起来 - 这样它们会更容易阅读。你的片段看起来非常复杂 - 一般来说,以下方法是否可行?从目标文件末尾提取与参考文件相同数量的行,然后将提取的行与参考文件进行比较。 - mklement0
1个回答

3

正如mklement0所建议的那样,一种解决方案可能是使用diff命令来比较目标文件中与源文件相同行数的最后几行。以下是草图:

#!/bin/bash
# USAGE: append_uniq.sh target source
# append source to target only if last part of target != source

target_file=$1
source_file=$2
source_num_lines=$(wc -l < "$source_file")
diff_target_lines=$(tail -n $source_num_lines "$target_file")

if ! diff "$source_file" <(echo "$diff_target_lines") > /dev/null; then
    echo "Appending $source_file to $target_file"
    cat "$source_file" >> "$target_file"
else
    echo "Already appended, skipping"
fi

奖励:一行代码

将文件a追加到文件lines中,除非a已经是最后一个被追加到lines的文件。两个文件必须存在:

! diff -q a <(tail -n $(wc -l < a) lines) && cat a >> lines

只是一个建议:你可以考虑使用$(wc -l <a)替换管道$(wc -l a | cut -d' ' -f1) - John1024
"+1",但请对“$source_file”和“$target_file”所有引用加上双引号。 - mklement0
我使用了以下代码:DIFF=$(diff $1 $2) if [ -s $1 ] && [ -s $2 ] && [ "$DIFF" != "" ]; then L1=$(diff $1 $2 | sed -e '1d' -e 's/^..//g' | diff - $2 | sed -e '1d' -e 's/^..//g' | grep -xc "-") if [[ $L1 -ne 1 ]]; then echo "在 $1 上的差异比对失败" exit 1; fi fi - SMC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接