ソースファイルからデータをコピーする前に、ターゲットファイルで重複した項目を確認してください。 [重複]

ソースファイルからデータをコピーする前に、ターゲットファイルで重複した項目を確認してください。 [重複]

行をコピーしようとしています。ソースファイル.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ように言ってください。greptarget.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_に重複した行がある場合)。

関連情報