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