我正在尝试复制行源文件.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
添加整体目标.txt
seen
文件到用整行的键调用的数组中seen[$0]
,并执行next
读取下一行。我们
!seen[$0]++
正在寻找一条线源文件.txt数组中不存在的,然后打印它。还添加源文件.txt将行文件写入数组以防止打印重复行(如果 source.txt_ 中存在重复行)。