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

Это пошаговое руководство по
Как скомпилировать и установить Pidgin и заставить его работать с Google Talk (~ Hangouts) на Linux:

Различия между Hangouts и Google Talk вы найдете на этой странице:
https://support.google.com/a/answer/4564211

1. Включите 2-Step Verification на этой странице:
https://accounts.google.com/SmsAuthConfig

2-Step Verification

2. Сгенерируйте новый пароль приложения для Pidgin на этой странице, выберите Другое и назовите его как угодно:
https://security.google.com/settings/security/apppasswords

App password

3. Установите последнюю версию Pidgin для вашей системы с этой страницы:
https://pidgin.im/download/ или из репозитория вашего дистрибутива Linux или скомпилируйте его из исходников (или для Max OS X рекомендуют использовать http://adium.im/)

4. Чтобы избежать ошибок безопасности, следует часто проверять, содержит ли репозиторий вашего дистрибутива Linux последнюю доступную версию, что можно проверить на этой странице https://pidgin.im/news/security/

5. Если вы выбрали компиляцию, вы просто устанавливаете зависимости, скачиваете и компилируете код, и устанавливаете Pidgin следующим образом:

$ sudo apt-get build-dep pidgin
$ sudo apt-get source pidgin
$ tar xjvf pidgin-2.x.y.tar.bz2
$ cd pidgin-2.x.y
$ ./configure && make && sudo make install

Альтернативный вариант, например, на Debian, где (по умолчанию) нужно su вместо sudo (сам не проверял, поправьте меня, если я ошибаюсь):

$ su -
# apt-get build-dep pidgin
# apt-get source pidgin
# exit
$ tar xjvf pidgin-2.x.y.tar.bz2
$ cd pidgin-2.x.y
$ ./configure && make
$ su -
# make install

Если по какой-то причине не получается, обратитесь к этой странице:
https://developer.pidgin.im/wiki/Installing%20Pidgin#WhycantIcompilePidgin

6. Щелкните правой кнопкой мыши значок Pidgin в системном трее и выберите Учетные записи.

7. Добавьте или измените свой аккаунт Google Talk, чтобы Имя пользователя было без @gmail.com или собственного домена.

8. Если у вас есть собственный домен для аккаунта Google, заполните поле Домен, в противном случае по умолчанию должно присутствовать gmail.com (без @).

9. Ресурс - это специфическая вещь XMPP, которая позволяет использовать несколько клиентов для одной учетной записи. При обычных обстоятельствах оставьте пустым.

10. Заполните Пароль, созданный на втором шаге.

11. Необязательно, но удобно, если вы находитесь на защищенном компьютере, поставить галочку Запомнить пароль.

12. Локальный псевдоним оставьте пустым.

13. Это должно выглядеть следующим образом:

Adding Google Talk account to Pidgin

14. На вкладке Advanced убедитесь, что у вас выбрано Require encryption и отключено plaintext.

15. Обратите внимание, что после сохранения этих настроек протокол автоматически изменится на XMPP, который в настоящее время доступен для сторонних приложений, таких как Pidgin.

3
19.09.2018, 17:26
6 ответов
$ awk 'NR > 1 { print $0 - prev } { prev = $0 }' <file.dat
-0.043962
-0.020674
0.002742
-0.004449
0.011906
-0.026333
0.001461
0.011245
-0.002031
-0.009281
-0.006112
0.011811
-0.004837

Делать это в цикле оболочки с вызовом bcнеудобно. В приведенном выше примере используется простой скрипт awk, который считывает значения из файла одно за другим и для любой строки после первой печатает разницу, как вы описываете.

Первый блок, NR > 1 { print $0 - prev }, условно печатает разницу между этой и предыдущей строкой, если мы достигли второй строки или дальше(NR— это количество прочитанных записей, а «запись» по умолчанию строка ).

Второй блок, { prev = $0 }, безоговорочно устанавливает prevна значение в текущей строке.

Перенаправить вывод на newfile.dat, чтобы сохранить там результат:

$ awk 'NR > 1 { print $0 - prev } { prev = $0 }' <file.dat >newfile.dat

Связанные:


Было некоторое упоминание о медленности вызова bcв цикле. Ниже приведен способ использования одного вызова bcдля выполнения арифметических операций при чтении данных в цикле оболочки. (На самом деле я бы не рекомендовал решать эту проблему таким образом, и я только показываю это здесь. для интересующихся со -процессами вbash):

#!/bin/bash

coproc bc

{
    read prev

    while read number; do
        printf '%f - %f\n' "$number" "$prev" >&"${COPROC[1]}"
        prev=$number

        read -u "${COPROC[0]}" result
        printf '%f\n' "$result"
    done
} <file.dat >newfile.dat

kill "$COPROC_PID"

Значение в ${COPROC[1]}является стандартным дескриптором входного файла bc, а ${COPROC[0]}— стандартным дескриптором выходного файла bc.

11
27.01.2020, 21:09

Если вы хотели попытаться заставить скрипт оболочки работать, вам просто не хватило инициализации:

f=myfile.dat
prev=0
while read line; do
    bc <<< "$line - $prev"
    prev=$line
done < $f > newfile.dat

... где я также переместил перенаправление за пределы цикла, просто чтобы сэкономить часть операций ввода-вывода.

Решение bcне печатает ведущие нули, в то время как решение awk печатает.

1
27.01.2020, 21:09

Вы можете использовать перенаправление execдля чтения последовательных строк входного файла из нескольких точек в сценарии -один раз перед циклом (для установки начального значения ),затем многократно в течение этого (для каждого нового значения вычитать):

exec 3<file.dat
read prev<&3
while read curr ; do
        bc <<< "$curr - $prev" >> newfile.dat
        prev=$curr
done <&3
1
27.01.2020, 21:09

Использование некоторых простых утилит GNU и отсутствие циклов оболочки:

paste -d- <(head -n-1 file.dat) <(tail -n+2 file.dat) | bc

Идея состоит в том, чтобы разбить входной файл на два столбца; сместите второй столбец на 1 строку и вставьте столбцы вместе с -в качестве разделителя. headи tailиспользуются для обрезки последней строки 1-го столбца и первой строки 2-го столбца соответственно для достижения необходимого смещения. Результирующий список является обязательным списком арифметических разностей, который передается в bcдля оценки.

Попробуйте онлайн .


В качестве альтернативы, если вам нравится sed, вы можете сделать это:

sed '1{s/$/-\\/;p;d};${p;d};s/.*/&\n&-\\/' file.dat | bc

Это дублирует каждую строку и вставляет -\в конце второй версии каждой строки. Первая и последняя строки обрабатываются по-разному для создания необходимых выражений. Вывод sed выглядит примерно так:

a-\
b
b-\
c
c-\
d

Это снова действительные арифметические разности, которые bcможно вычислить. Не то, чтобы bcпонимал обратную косую черту продолжения строки -на концах каждой второй строки.

Попробуйте онлайн .

4
27.01.2020, 21:09

Я использую массивы. Я использую их для всего. Я не могу вспомнить, как работают awk и sed, без тщательного изучения справочных страниц. Вот как бы я это сделал.

f=( $(< file.dat) )
for ((num=1;num<=${#f[@]};num++))
do
    echo $(bc <<< ${f[$num]}-${f[(($num-1))]})>>differences.dat
done

Я так понимаю. Он имеет неприятные особенности некоторых других ответов :зацикливание и вызов bc снова и снова. Однако он читает файл только один раз, как и ответы с использованием sed и awk.

0
27.01.2020, 21:09

Вы можете попробовать это

num <- as.data.frame(num)
num$sub_num <- num[c(2:14, c("0")), ]
num$diff <- num$num - num$sub_num
-1
27.01.2020, 21:09

Теги

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