Linuxのファイルから特定の行番号を削除する(変数として渡される)

Linuxのファイルから特定の行番号を削除する(変数として渡される)

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」)を作成するために使用されます。edContentFile

答え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

関連情報