1

ファイルから行のペアを削除する方法を見つけようとしています。ペアの最初の行には一意の ID が含まれ、2 行目には文字列が含まれています。私はその線に沿って何かを考えていました

for i in $(cat idlist.txt ); do grep -v -A1 $i file1 

しかし、反復ごとにループの出力をループに戻す方法がわかりませんか? 任意のヒント?

私が変更しているファイルは基本的に次の形式です

uniqueID.1
OJNEFONEOIWENWEJNEWEJ
uniqueID.2
HHTHANJAHTNTHAJNTEOEJ

削除したい ID + 文字列がいくつかあります。

ありがとう

4

2 に答える 2

0

リスト内のパターンごとにファイルを読み書きするのは非常に効率が悪いようです。ファイルを一度だけ読み取って処理し、すべての ID を一度に削除することをお勧めします。

これを行う方法は、そのファイルにある ID の種類によって異なりますidlist.txt。パターンを に渡す方法からするgrepと、それらは単語または単純な正規表現である必要があるように見えるため、次のアプローチを試すことができます。

まず、ID をsedプログラムに変換します。

PROGRAM=$(while read ID; do echo "/$ID/{N;d;}"; done < idlist.txt)

次に、使用sedしてプログラムを実行し、ファイルをその場で更新します。

sed -i '' -e "$PROGRAM" -- file1

プログラムが動作する方法は/$ID/、id を含む行を照合し、コマンドがNファイルから次の行を読み取り、dコマンドが両方の行を削除することです。他の行は正常に印刷されます。$ID(明らかに、これは、文字を含まない有効な基本正規表現であることに依存し/ます。)

sed「拡張正規表現」 (-rプログラムの GNU バージョンのオプション、またはBSD バージョンのオプション) を受け入れるのバージョンがある場合は-E、すべての ID を単一の正規表現にコンパイルできます。

PROGRAM=$(printf '/('; tr '\n' '|' < idlist.txt; printf '.^)/{N;d;}')
sed -r -i '' -e "$PROGRAM" -- file1

(.^これは、一致する可能性がない正規表現です。|正規表現の final に続いて、代替の final 句からの一致がないことを確認します。)

于 2013-10-28T20:46:31.773 に答える