Удалить повторяющиеся строки в файле без создания нового файла в Ubuntu

Итак, я нашел решение, хотя это скорее обходной путь, чем правильное решение. Так что я все еще не могу, насколько мне известно, напрямую пройти через мою клавиатуру.

Чтобы решить эту проблему, я сначала удалил беспроводную клавиатуру/мышь и вместо этого добавил свою хорошую мышь в качестве транзитной. Таким образом, мой беспроводной комбо предназначен для моего хоста Linux, и хорошая клавиатура также есть на хосте Linux, только хорошая мышь предназначена только для Windows.

Затем я настроил сервер display spice, чтобы Windows работала как окно в Linux, однако здесь нет дисплея, только черный экран (, что нормально ). Теперь я нажимаю на это окно с помощью своего беспроводного комбо и управляю окнами с помощью моей хорошей мыши, и нажатия клавиш моей хорошей клавиатуры также проходят!

Я немного волновался, что это вызовет небольшую задержку, однако после тестового раунда в Dirty Bomb я не почувствовал заметной задержки ни с мышью, ни с клавиатурой. Так что, кажется, работает отлично. Я бы все же предпочел напрямую проходить через аппаратное обеспечение, но я не могу жаловаться.

3
16.12.2020, 12:26
3 ответа

Существует риск повреждения файла в случае прерывания команды:

{ awk '!seen[$0]++'; 
 python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'; } <sample.txt 1<>sample.txt

Мы создаем группу команд внутри фигурных скобок, перенаправляя стандартный ввод для группы на sample.text, а также открывая sample.txtв режиме чтения+записи без усечения через 1<>sample.txt.

awk '!seen[$0]++'— это идиома awk для удаления дубликатов при сохранении порядка

Когда команда awkзавершается, дескриптор файла, соответствующий стандартному выводу, размещается в каком-то промежуточном месте в пределах sample.txt, и sample.txtнеобходимо урезать до этого места. Я могу придумать два способа добиться этого

  1. python -c 'import sys; sys.stdout.truncate(sys.stdout.tell())'является опцией, если установлено python

  2. В системе GNU Linuxtruncate -s "$(awk '/^pos:/{print $2}' /proc/$$/fdinfo/1)" sample.txt

0
28.04.2021, 23:16

Можно использовать sortс-o

sort -u sample.txt -o sample.txt

-uдля уникальных

-oдля выходного имени файла

-1
28.04.2021, 23:16

Специально используя GNU awkи его недавно приобретенную способность выполнять -редактирование места,

$ cat file
1
2
1
3
4
1
$ awk -i inplace '!seen[$0]++' file
$ cat file
1
2
3
4

Обратите внимание, что, как и в случае с большинством инструментов, которые выполняют «в -редактирование места» (, например. sed -i), для выполнения редактирования используется временный файл. Однако вам не нужно вручную перемещать файлы.

См. также:

1
28.04.2021, 23:16

Теги

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