2013-06-20 5 views
3

Привет я должен удалить некоторые строки в файле:удалить строки с конкретным шаблоном

file 1 
1 2 3 
4 5 6 

file 2 
1 2 3 6 
5 7 8 7 
4 5 6 9 

Я должен удалить все строки файла 1, что я найти в файле 2:

output 
5 7 8 7 

Я использовал sed:

for sample_index in $(seq 1 3) 
do 
    sample=$(awk 'NR=='$sample_index'' file1) 
    sed "/${sample}/d" file2 > tmp 
done 

но он не работает. Он ничего не печатает. у вас есть какие-либо идеи Это дает мне ошибку? СЭД: -e выражение # 1, символ 0: регулярное выражение прецедент необходимый "

+0

Из вашего примера вы хотите найти подстроку, а не всю строку. – l0b0

+0

Также см. Http://stackoverflow.com/questions/16477782/delete-lines-based-on-pattern-on-another-file – devnull

ответ

3

Это должно работать, если ваши реальные данные, как 3-х колонок:

awk 'NR==FNR{a[$1$2$3]++;next}!($1$2$3 in a)' file{1,2} 

Для переменных столбцов:

awk 'NR==FNR{a[$0]++;next}{for(x in a) if(index($0,x)>0) next}1' file{1,2} 
4

Это может быть началом:

$ grep -vf file1 file2 
5 7 8 7 

Один потенциальной ловушки здесь т Если вы положили 5 6 9 в качестве второй строки file1, выход не изменится. Я не уверен, если вы хотите этого или нет. Если нет, то вы можете попробовать

grep -vf <(sed 's/^/^/' file1) file2 
+0

Я не могу использовать grep, так как у меня тоже есть отрицательные числа, и он не различает положительные. Я бы предпочел использовать awk, но я не знаю, как – ayasha

+0

@ user18350 Можете ли вы обновить свой вопрос таким примером? Я не уверен, что понимаю проблему –

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