Вы добавляете свой файл в игнор-лист клавишей-I
(буква i прописная ). Вы должны заменить его на-l
(букву L маленькую)
ls -l myFile
Поскольку 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
Как насчет
awk '!NF||$1~/^#/ {print; next} {$1=$1} !seen[$0]++' /tmp/fstab
Это немедленно напечатает без изменений любую пустую строку или чье первое поле начинается с #
, а затем пропустит выполнение, чтобы пропустить любой дальнейший код. Все остальные строки будут перестроены и напечатаны до тех пор, пока они еще не встретились.
Причина проверки соответствия $1~/^#/
вместо применения совпадения ко всей строке (, то есть просто /^#/
), заключается в том, что таким образом мы также отлавливаем строки комментариев, в которых #
предшествует пробел. Хотя справочная страница для fstab
требует, чтобы для того, чтобы квалифицироваться как строка комментария, первый символ должен быть #
, как отметил @StephenKitt, реализация Linux libmount
будет пропускать начальные пробелы и принять строку в качестве комментария также, если первый не -пробельный символ является #
.
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