удалить строку из файла, содержащую точное число, и выйти при первом поиске и удалении

Я пытаюсь удалить числовое значение только один раз из файла, где может быть более одного экземпляра этого значения. файл_ввод =

2  
4  
18  
8  
8  
10  
12  
14  

Мне нужно удалить «8», но только один раз, и я хочу сохранить «18». Окончательный результат должен быть в file_output как таковой:

2  
4  
18  
8  
10  
12  
14  

Я пробовал sed '/8/d', grep -v -w '8' и awk '$1 !=8', но все они удаляют 8, 8 и 18.


person user312288    schedule 28.12.2017    source источник
comment
Как заменить «8» на переменную, такую ​​как $number, поскольку эта функция может быть вызвана для удаления другого числа при использовании?   -  person user312288    schedule 28.12.2017
comment
С переменной: n="8"; sed '1,/^'"$n"'$/{/^'"$n"'$/d}' file   -  person Cyrus    schedule 29.12.2017


Ответы (2)


Я предлагаю с GNU sed:

sed '1,/^8$/{/^8$/d}' file

Выход:

2
4
8
10
12
14

От первой строки к строке, содержащей только 8 (1,/^8$/), удалить строку, содержащую только 8 (/^8$/d).


См. man sed и Часто задаваемые вопросы о регулярных выражениях переполнения стека.

person Cyrus    schedule 28.12.2017
comment
Это работает так, как я хочу, даже если я добавлю 88 перед значением 8. Замечательно, спасибо. - person user312288; 28.12.2017
comment
Когда вам приходится писать один и тот же код несколько раз (например, /^8$/ дважды в данном случае), это означает, что вам следует искать другое решение. - person Ed Morton; 28.12.2017

Вот awk версия

$ awk '!($1==8 && !c++)' ip.txt
2  
4  
18  
8  
10  
12  
14  
  • $1==8 && !c++ check if first field is exactly 8, if so check whether c evaluates to false(c will get incremented and so won't be false next time)
    • we don't want to print when this is true, hence the outer negation
  • это будет работать, даже если вокруг первого поля есть пробелы, как в рассматриваемом примере
person Sundeep    schedule 28.12.2017
comment
Кхм, двойное отрицание? awk '$1==8 && !c++{next} 1' ip.txt - person Ed Morton; 28.12.2017