Предоставляют ли sed и awk что-либо, что я не могу тривиально сделать в сценарии bash с помощью простого bash?

Та же проблема с KDE на Arch. Обходной путь, который я нашел, — отключить вывод на внешний монитор прямо перед повторным вызовом xrandr с желаемыми настройками масштабирования. По какой-то причине при этом я правильно получаю рабочий стол Plasma в полном размере -на внешнем мониторе.

Далее следует команда, которую я использую, вы, вероятно, можете настроить ее значениями, которые подходят для вашей настройки(DP-1— это внешний монитор, eDP-1монитор крышки ноутбука):

# This line turns off the external monitor
xrandr --output DP-1 --off

# This turns the external monitor back on, and gives settings for both monitors
xrandr --output eDP-1 --scale 1x1 \
       --output DP-1 --auto --scale 2x2 --right-of eDP-1
1
03.10.2020, 18:01
1 ответ

Это похоже на вопрос, есть ли смысл учиться водить машину, если вы уже умеете ползать на четвереньках. Да, bash можно использовать для некоторых базовых операций с текстом или простой математики, но это самый медленный инструмент для этого, его синтаксис сложен, и очень и очень легко ошибиться. Кроме того, оболочки, включая bash, не могут выполнять арифметические операции с плавающей запятой, что сильно ограничивает возможности достижения результатов, используя только оболочку.

Любая из этих причин была бы достаточной, но вот очень простой пример. Возьмите файл, в котором нет ничего более сложного, чем числа от 1 до 100 000, перемешанные в случайном порядке :

.
seq 100000 | shuf > file

Теперь давайте выберем все нечетные числа. В bash вы можете сделать что-то вроде этого:

$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile

real    0m3.481s
user    0m2.648s
sys     0m0.801s

На моей машине это заняло около 3 секунд. Что, если мы сделаем то же самое, но с числами от 1 до 1 000 000?

seq 1000000 | shuf > file

И:

$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile

real    0m32.483s
user    0m25.035s
sys     0m7.343s

Уже больше 30 секунд! Теперь сравните то же самое в awk, которое может правильно вычислить:

$ time awk '$1 % 2 !=0' file > newfile 

real    0m0.344s
user    0m0.340s
sys     0m0.003s

Меньше секунды. А как насчет sed, используя тот же подход к сопоставлению текста -/

$ time sed -n '/[13579]$/p' file > newfile 

real    0m0.280s
user    0m0.273s
sys     0m0.007s

Меньше секунды, еще раз. Что, если мы поднимемся до 10 000 000?

$ seq 1000000 | shuf > file
$ time awk '$1 % 2 !=0' file > newfile 

real    0m4.081s
user    0m3.896s
sys     0m0.090s

$ time sed -n '/[13579]$/p' file > newfile 

real    0m2.898s
user    0m2.683s
sys     0m0.111s

$ time while read num; do [[ $num =~ [24680]$ ]] || echo $num; done < file > newfile1

real    5m42.445s
user    4m25.687s
sys     1m15.241s

Как видите, решение оболочки на несколько порядков медленнее, чем решения без -оболочки. А файл с 10 миллионами строк — не такая уж редкость. Это всего лишь текстовый файл размером 76 МБ. Кроме того, оба решения без оболочки -намного короче (с точки зрения длины символов )и, если вы знаете их синтаксис, намного проще.

Итак, это тот случай, когда «когда все, что у вас есть, это молоток, все выглядит как гвоздь». Да, bash может делать некоторые вещи, которые вы можете делать с помощью таких инструментов, как sedили awk, но он намного медленнее и не так хорош в работе.

9
18.03.2021, 23:00

Теги

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