Я использовал
awk -v BINMODE=rw '!($0 in a){a[$0];print}' infile >> outfile
BINMODE = RW: Чтобы сохранить конец линейных терминаторах счастливыми. (Я живу в среде смешанной ОС)
Логика проста.
Если текущая строка не находится в ассоциативном массиве, то добавьте его в ассоциативный массив и печать на вывод.
Может быть ограничения памяти с этим подходом. Для очень больших файлов и наборов файлов я использовал вариации на это, используя хранилище файлов, чтобы пройти мимо ограничений.
Вы неправильно используете регулярные выражения. TES *
означает TE
с любым числом S
, поэтому Test-файл-1
будет переименован в Файл 1T-файл-1
:
$ rename -n 's/tes*/file 1/' *
test-file-1 renamed as file 1t-file-1
Аналогично, ^ *
будет соответствовать пустой строке, появляющейся в начале, поэтому, как это похоже на ^
, но с Инифинитная петля:
$ rename -n 's/^*/file 1/' *
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE / at (eval 1) line 1.
example2 renamed as file 1example2
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE / at (eval 2) line 1.
test-file-1 renamed as file 1test-file-1
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE / at (eval 3) line 1.
third renamed as file 1third
Вы должны, вместо этого использовать . *
- .
Соответствует всем персонажам, кроме новой строки, обычно:
$ rename -n 's/tes.*/file 1/' *
test-file-1 renamed as file 1
$ rename -n 's/.*/file 1/' *
example2 renamed as file 1
test-file-1 renamed as file 1
third renamed as file 1
, естественно, я ожидаю, что эта последняя команда создавать проблемы.