Как нормализовать нерегулярные значения данных

На Unix-подобных системах *.sh - это глобусное выражение, которое расширяется оболочкой и результаты передаются в качестве аргументов вызываемой программе. Если и только в случае отсутствия совпадающих файлов, выражение глобуса будет передано как есть. Вы должны привыкнуть цитировать подстановочные знаки, если хотите, чтобы они передавались запущенной программе.

В качестве примера, если вы запустите найдите . -путь *.sh из /путь/do_not_upload/updates/1.1.1/run_pre_update/, то выполняемая команда будет find . -путь 001.sh 002.sh, что почти наверняка не то, что вам нужно.

Обратите внимание, что это отличается от MS-DOS и связанных с ней систем, в которых расширение glob выполняется (или не выполняется) вызываемой программой.

Чтобы предотвратить расширения оболочки, заключите аргумент в двойные или даже одинарные кавычки - это передаст его вызываемой программе дословно и, таким образом, позволит найти сделать свои собственные расширения:

$ find . -path '*.sh'
1
23.05.2017, 15:40
1 ответ

Ваша иллюстрация не совсем соответствует вашим словам.  Если вы имеете в виду то, что вы говорите (и если я правильно понимаю ваши слова), и если предположить, что у вас есть список значений "Y". (т.е. количество часов в диапазоне от 0 до 2400). которые вы хотите нормализовать, вы можете сделать то, что хотите, с помощью этого awk кода:

awk '
    NR==1 { prev_good = $1 }
    {
        data = $1
        if (data < prev_good) {
                count++
                next
        }
        if (count > 0) {
                count++
                for (i = 1; i < count; i++) {
                        print prev_good + (data-prev_good) * i / count
                }
                count = 0
        }
        print data
        prev_good = data
}'

Он предполагает, что первая точка данных достоверна (NR==1 { prev_good = $1 }).  После этого, если точка данных меньше предыдущего хорошего значения (prev_good, которое является наибольшим значением, наблюдавшимся до сих пор), рассматривайте ее как недействительную: пропустите ее (next) и посчитайте точки, которые вы пропустили.  Когда вы получите хорошее значение, проверьте count - если оно положительное, это означает, что мы пропустили некоторые данные, поэтому сгенерируйте такое количество значений данных, линейно интерполируя между последним хорошим значением и текущим значением.  Затем выведите новое достоверное значение.

Если ваши входные данные содержат "X" и "Y" (дата и часы), это становится немного сложнее - особенно если интервалы "X" неравномерны.

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

0
28.01.2020, 01:36

Теги

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