从源文件复制数据之前检查目标文件是否有重复条目

从源文件复制数据之前检查目标文件是否有重复条目

我正在尝试复制行源文件.txt目标.txt。我希望这个bash脚本检查每一行目标.txt如果复制之前有重复的条目。

源文件.txt包含:

a$$a$$a
b**b**
c%%cc%%
d##d##d##
e^^e^^e^^

目标.txt包含:

a$$a$$a
ee$$ee$$
ff__ff__
gg@@gg@@
zzxxzzxx
bb..bb..bb
e^^e^^e^^
hh;;hh;;hh

在这种情况下,我假设只有 3 个条目将被复制到目标.txt 哪个是:

b**b**
c%%cc%%
d##d##d##

我的测试代码是:

#!/bin/bash
echo "started"
programpath=/home/mysite/www/copyfiles

var str input ; cat "$programpath/source.txt" > $input 
var str target ; cat "$programpath/target.txt" > $target 

cat $input >> $target

uniq -u "$target"

echo "finished"
    exit 1
fi

答案1

为什么使用bash?该grep命令可以干净地完成这项工作。

grep -Fxvf target.txt source.txt #>> target.txt

这将返回仅存在于的那些行源文件.txt,然后您可以将这些行附加到您的 目标.txt只需取消注释即可#>> target.txt

您可能还需要独特的源文件.txt之前,以防止附加重复的条目(如果在)源文件.txt文件,awk接下来也执行相同的操作。

grep -Fxvf target.txt <(sort -u source.txt) #>> target.txt
  • -F选项告诉grep匹配模式作为字符串而不是正则表达式。
  • 通过-x选项,我们告诉整条线是我的模式。
  • -v是反向匹配,如果您错过了它,则会输出两个文件中都存在的行。
  • -f告诉grep从这里的文件中读取我的模式target.txt

或者你也可以用它awk来代替。

awk 'NR==FNR{seen[$0]=1;next} !seen[$0]++' target.txt source.txt #>> target.txt
  • 添加整体目标.txtseen文件到用整行的键调用的数组中seen[$0],并执行next读取下一行。

  • 我们!seen[$0]++正在寻找一条线源文件.txt数组中不存在的,然后打印它。还添加源文件.txt将行文件写入数组以防止打印重复行(如果 source.txt_ 中存在重复行)。

相关内容