2013-02-26 3 views
0

У меня есть большой текстовый файл, из которого я хочу удалить некоторые строки, которые находятся в другом текстовом файле. Кажется, что команда sed в оболочке Unix - хороший способ сделать это. Однако я не смог определить, какие флаги использовать для этого. ,Использование sed для удаления строк из txt-файла

database.txt:

this is line 1 
this is line 2 
this is line 3 
this is line 4 
this is line 5 

lines_to_remove.txt

this is line 1 
this is line 3 

what_i_want.txt

this is line 2 
this is line 4 
this is line 5 

ответ

6

grep гораздо лучше подходит, чем sed для этого:

grep -Fxv -f lines_to_remove.txt database.txt > what_i_really_really_want.txt 
+0

Вы уверены, что команда работает или это на моем конце? Я получаю сообщение grep: Invalid back reference. – nunos

+0

Ваш файл lines_to_remove.txt должен содержать некоторые специальные символы. Попробуйте добавить '-F'. Редактирование ... –

+0

не будет работать корректно, если в файле database.txt есть что-то вроде 'this line 10'. Вы должны добавить '-x' для соответствия целым строкам. – dogbane

1

В awk:

$ awk 'NR==FNR{a[$0];next}!($0 in a)' remove.txt database.txt 
this is line 2 
this is line 4 
this is line 5 

$ awk 'NR==FNR{a[$0];next}!($0 in a)' remove.txt database.txt > output.txt 
+0

+1 для решения, но я рекомендую вам не использовать букву 'l' (el) в качестве имени переменной, поскольку она слишком похожа на номер' 1' (одна) и даже неразличима в некоторых шрифтах и ​​поэтому обфускации ваш код. То же самое для буквы 'O' (oh) и числа' 0' (ноль). –

1

Я хотел бы использовать comm для этого:

comm -1 <(sort database.txt) <(sort lines_to_remove.txt) > what_i_want.txt 

Команда намного лучше подходит для ваших нужд.

ПРИМЕЧАНИЕ: Синтаксис <(commmand) является багизмом и поэтому сильно клевете на SO. Это короткая рука для следующего:

Смежные вопросы