F
複数行のテキストを含むテキストファイルと、その行に対応する数値リストをL
含む別のテキストファイルがありますが、F
リスト内のすべての行をL
削除したいと思います。F
次の例では:
cat F.txt
aaa
bbb
ccc
cat L.txt
1
3
1
行を削除し、行2を3
残してF.txt
新しいファイルに保存するコマンドが必要ですF_new.txt
。
cat F_new.txt
bbb
答え1
awk
最初のファイルの行番号をNR==FNR
配列としてロードし、その行の配列要素が存在しないp[]
2番目のファイルから印刷するだけです。NR!=FNR
!p[FNR]
awk 'NR==FNR{p[$1]=$1}
NR!=FNR&&!p[FNR]' L.txt F.txt > F_New.txt
bbb
答え2
別のオプションは、sedの内容をL.txt
一連のコマンドに変換することです。d
printf '%dd\n' $(<L.txt) | sed -f - F.txt > F_New.txt
sed自体を使用して変換を実行することもできます。
sed 's/$/d/' L.txt | sed -f - F.txt > F_New.txt
答え3
cp F.txt F_new.txt
for i in $(sort -nr L.txt)
do
sed -i "${i}d" F_new.txt
done