2つのファイルがあり、1つはもう1つの親セットです。大きなファイルから小さいファイルの同じ行を削除したいと思います。
考えられる問題の1つは、その行にバックスラッシュが含まれていることです。
どうすればいいですか?
答え1
これは私の作品です。
remove_lines()
{
# remove lines from a file
#
# $1 - source file with patterns of lines to be removed
# $2 - destination file
tmpfile=$(mktemp "$(dirname -- "$2")"/XXXXXXXX) &&
grep -F -f "$1" -v -- "$2" >>"$tmpfile" &&
mv -- "$tmpfile" "$2" &&
}
編集:ちょうどそれがそこにないことに気づきましたsed
。しかし、それはあまり重要ではありません。そうですか?
答え2
@rajishの答えgrep
は近いですが、何か落ちました。同じコンテンツの削除に関する質問ワイヤー。デフォルトではgrep
一致します。ひも(ラインの一部)。
POSIX grep適切なオプションがあります。
-x
ターミネータを除いて、行のすべての文字を使用する入力行のみが考慮されます。新しいチーム完全固定文字列または正規表現を一致する行に一致させます。
これを考慮すると、grep
次のようにすることができます。
cp -f -p input.txt input.txt~
grep -v -x -F -f input.pat input.txt~ >input.txt
どこEnter.pat削除する行が含まれています。入力.txt更新するファイルです。
@nvarunのソリューション使用 sed
パターンファイルで文字をエスケープしないこと/
を除いて、同様の問題があります。この例は私にとって効果的で、構文を次のように制限します。POSIX sed:
cp -f -p input.txt input.txt~
sed -e 's/\([\/]\)/\\\1/g' -e 's/^/\/^/' -e 's/$/$\/d/' input.pat > input.sed
sed -f input.sed input.txt~ >input.txt
きれいにするために、両方を更新する前に元のファイルを保存してください(POSIX CP)。
Enter.pat
first
this is second
second/third
second\third
入力.txt
first
only first should match
this is not first
this is second
the previous line said this is second
first/second/third
second/third
first\second\third
second\third
結果:
only first should match
this is not first
the previous line said this is second
first/second/third
first\second\third
答え3
次のスクリプトを試してください。
## $1 - Small File
## $2 - Large File
sed 's/^/\//; s/$/\/d/; s/\\/\\\\/g' $1 > $HOME/sed_scpt.txt
sed 's/\\/\\\\/g' $2 | sed -f $HOME/sed_scpt.txt > $HOME/desired_output.txt
## Alternatively, you could change the 2nd line with the following;
sed -f $HOME/sed_scpt.txt $2 > $HOME/desired_output.txt
注:私はGNU sed 4.2.1を使用しました。