перемещение информации о файле в другой файл

Кроме того, это работает для меня:

xinput --set-prop "NAME_OF_YOUR_MOUSE" "Device Accel Constant Deceleration" 3

Где ИМЯ _ИЗ _ВАШЕЙ _МЫШИ — это имя вашей мыши, которое можно получить, просто набрав

xinput

в терминале.

Вы можете добавить эту команду в «Автозапуск приложения», в настройках «Сеанс и запуск».

-1
25.04.2021, 10:28
2 ответа
awk -v name=Paul '
    BEGIN { RS=""; FS=":"; ORS="\n\n"; name = tolower(name) }
    tolower($2) == name { print; next }
    { print >(FILENAME ".new") }' current_employee.txt >>former_employee.txt

Это сделало бы несколько вещей, учитывая имя в командной строке (здесьPaul). Он будет обрабатывать входной файл current_employee.txtкак набор записей, между которыми есть пустая строка (вот что делает RS=""). Каждая такая запись делится на поля на основе :, так что (при условии, что строка nameвсегда первая,)$1всегда является меткой name, а $2всегда является именем сотрудника.

Затем он устанавливает разделитель выходных записей на двойную новую строку, чтобы убедиться, что в конце каждой записи, которую выводит код, всегда будет пустая строка. Это также нижний -регистр имени запроса, на тот случай, если верхний/нижний регистр строки запроса и данных нельзя полностью доверять правильности(johnуже все в нижнем регистре, например ).

Если имя в нижнем регистре в текущей записи, прочитанной из входного файла, совпадает с нашей строкой запроса в нижнем регистре, то выводится вся запись, и программа переходит к следующей строке ввода, используя next.

Если имя в текущей записи не то, что мы ищем, запись также выводится, но в файл, имя файла которого совпадает с именем файла входного файла, с добавлением .newв конец.

Результатом кода awkявляется добавление с >>к файлу former_employee.txt.

Это означает, что при запуске вы получите нечто подобное:

$ ls
current_employee.txt
$ cat current_employee.txt
name:john
surname:James
salary:3000
department:finance

name:Paul
surname:Perez
salary:5000
department:inventory

name:Abel
surname:Wood
salary:4000
department:inventory
$ awk -v name=Paul '
    BEGIN { RS=""; FS=":"; ORS="\n\n"; name = tolower(name) }
    tolower($2) == name { print; next }
    { print >(FILENAME ".new") }' current_employee.txt >>former_employee.txt
$ ls
current_employee.txt      current_employee.txt.new  former_employee.txt
$ cat former_employee.txt
name:Paul
surname:Perez
salary:5000
department:inventory

$ cat current_employee.txt.new
name:john
surname:James
salary:3000
department:finance

name:Abel
surname:Wood
salary:4000
department:inventory

Затем вы можете использовать

mv current_employee.txt.new current_employee.txt

для замены старых записей текущего сотрудника обновленными записями.


Вышеупомянутая слегка громоздкая команда заключена в сценарий оболочки и придана ей немного больше воздуха:

#!/bin/sh

for file in current_employee.txt former_employee.txt
do
    if [ -f "$file" ] && cp "$file" "$file-orig"; then
        printf 'Backed up %s as %s-orig\n' "$file" "$file"
    fi
done

awk -v name="$1" '
BEGIN {
    RS = ""
    FS = ":"
    ORS = "\n\n"
    name = tolower(name)
}

tolower($2) == name { print; next }

{ print >(FILENAME ".new") }' current_employee.txt >>former_employee.txt &&
mv current_employee.txt.new current_employee.txt

Этот сценарий создаст резервную копию двух файлов current_employee.txtи former_employee.txt, а затем обновит их в соответствии с именем, заданным в качестве первого аргумента сценария.

Обычно вы используете этот скрипт как

$./script Paul
1
28.04.2021, 22:51

Использование утилиты GNU awk v4.1.0 или более поздней версии с параметром inplace для редактирования файлов в -месте

# set input n output filenames
if=current_employee.txt
of=former_employee.txt

gawk -F: -i inplace -v n="John" '
  /^name:/&&tolower($2)==tolower(n),!NF{
    print >> OUT;next
  }1
' OUT="$of" "$if"

С помощью редактора строк GNU ed:

### set input n output filenames
if=current_employee.txt
of=former_employee.txt

### user defined function to make changes
fx() {
  ## unpack arguments
  n=$1

  ## escape any regex chars in name
  for e in \\ \[ ^ \$. \* /;do
    n=${n//"$e"/\\"$e"}
  done

  ## make name case insensitive
  set -- {a..z}
  for UC in {A..Z}; do
    lc=$1; shift
    n=${n//[$lc$UC]/"[$lc$UC]"}
  done

  ## define the block which contains the name e.g., john
  block="?^name:${n}\$?;/^\$/"

  ## invoke ed editor to make changes
  ed -s "$if" <<eof
# add a dummy line to eof
a

.
# append block to former employee file
${block}W $of
# delete block from current employee file
${block}d
# take away the dummy line added
\$d
# save n quit from the current employee file
wq
eof
}

## and now invoke fx to make the changes in files
fx 'john'
### end

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

0
28.04.2021, 22:51

Теги

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