Удалите повторяющиеся строки, возможно, с другим интервалом, но игнорируйте строки, начинающиеся с #

Вы добавляете свой файл в игнор-лист клавишей-I(буква i прописная ). Вы должны заменить его на-l(букву L маленькую)

ls -l myFile 
-4
04.03.2021, 16:36
3 ответа

Поскольку bashжалуется на (, а не на awk), и вы заключаете !в одинарные кавычки, проблема очевидна :вы выходите из командного блока awk.

awk '{$1=$1} /^#/ || !seen[$0]++' file 

. делай операцию, потом чеки. Недостаток :Удаляет/уменьшает пробелы в комментариях, но не удаляет такие дубликаты. Избегайте этого, предварительно буферизовав строку:

awk  '{a=$0 ; $1=$1}  /^#/ || !seen[$0]++ {print a}' file

Вход:

#comment
duplicate line
#comment
duplicate    line 
not duplicate
not duplicate 2
duplicate        line
#comment2
#comment2
#comment 3
#comment      3

Вывод (первого кода)

#comment
duplicate line
#comment
not duplicate
not duplicate 2
#comment2
#comment2
#comment 3
#comment 3

Вывод (второго кода)

#comment
duplicate line
#comment
not duplicate
not duplicate 2
#comment2
#comment2
#comment 3
#comment      3
1
18.03.2021, 22:27

Как насчет

awk '!NF||$1~/^#/ {print; next} {$1=$1} !seen[$0]++' /tmp/fstab

Это немедленно напечатает без изменений любую пустую строку или чье первое поле начинается с #, а затем пропустит выполнение, чтобы пропустить любой дальнейший код. Все остальные строки будут перестроены и напечатаны до тех пор, пока они еще не встретились.

Причина проверки соответствия $1~/^#/вместо применения совпадения ко всей строке (, то есть просто /^#/), заключается в том, что таким образом мы также отлавливаем строки комментариев, в которых #предшествует пробел. Хотя справочная страница для fstabтребует, чтобы для того, чтобы квалифицироваться как строка комментария, первый символ должен быть #, как отметил @StephenKitt, реализация Linux libmountбудет пропускать начальные пробелы и принять строку в качестве комментария также, если первый не -пробельный символ является #.

6
18.03.2021, 22:27

GNU sedс включенным расширенным режимом регулярных выражений-E

sed -Ee '
  # print empty|blank|comment lines
  /^\s*(#|$)/b
  s/\s+/ /g;s/^ | $//g;G;        # squeeze whitespace n append previous unique lines
  /^([^\n]*)\n(.*\n)?\1(\n|$)/d; # delete if seen
  P;h;d;                         # print seen first time then update seen list
'  file
1
18.03.2021, 22:27

Теги

Похожие вопросы