2つのファイルがあります。 1つは(不要な)行のリストを持ち、もう1つのSeqlist
テキストファイル(その行を削除しようとしている)は次のように言います。ContentFile
$cat Seqlist
3
4
7
10
345
7000
67001
.....
私は以下を使用しました:
$ while read A; do sed -e "$((A)d" ContentFile; done < Seqlist >OUTPUT
ところで、3行目の番号だけを消しました。残りの行は削除されません。
答え1
d
行番号ファイルの各番号の末尾にを追加すると、sed
入力から指定された行を削除するスクリプトに変換されます。もしそうなら、とても簡単です。
$ sed -f lines_to_delete.sed file_with_lines.txt
スクリプトsed
は次のように生成できます。
$ sed -e 's/$/d/' file_with_numbers.txt >lines_to_delete.sed
答え2
使用ed
:
printf "%s\n" $(printf "%sd\n" $(sort -rnu Seqlist)) w | ed ContentFile
これは、編集用のprintf
コマンドリスト(Seqlistの一意の逆ソート行番号リストから行を削除するコマンド、変更されたファイルをディスクに書き換える「w」)を作成するために使用されます。ed
ContentFile
答え3
行番号のリストがメモリに収まる場合(ただし、必ずしもコンテンツファイルである必要はありませんed
)、次のことができます。
awk 'FNR==NR{n[$0];next} !(FNR in n)' Seqfile ContentFile
両方のファイルが大きいか大きい場合があり、Seqfileがソートされている場合
cat -n ContentFile | join -v2 -j1 Seqfile - | sed 's/^[0-9]* //'
答え4
問題は、スクリプトが最初にsedを介してファイル全体を実行するため、他の数字は機能しないことです。
最も簡単な解決策は、行リストを作成し、sedを介して一度実行することです。
s=
while read a
do s="$s$a d;"
done < Seqlist
sed -e "$s" ContentFile >OUTPUT