Нахождение числа времени конкретное число в файле, где диапазон также указан

Можно на самом деле сделать этого бродягу использования:

БРОДЯГА поддерживает 'Прозрачный Удаленный (файл) Доступ, Несколько Протоколируют'. Этот пакет обеспечивает удаленное редактирование файла, подобное Ange-FTP. Различие - то, что Ange-FTP использует FTP для передачи файлов между локальным и удаленным хостом, тогда как БРОДЯГА использует комбинацию rsh и rcp или других программ работы одинаково, таких как ssh/scp.

Добавьте эти строки к Вашему ~/.emacs файл (источник):

(require 'tramp)
(setq tramp-default-method "scp")

Необходимо затем смочь открыть удаленный файл как это:

emacs /remote.server.com:/remote/path/foo.txt

Специально для использования с psql команда Вам было бы нужно что-то другое все же. Не имейте способа протестировать это теперь, но возможно установить emacs, поскольку псевдоним к Вашему локальному emacs мог бы работать. Добавьте эту строку к своему удаленному .bashrc файл:

alias emacs='ssh user@local emacs'

4
21.07.2014, 19:59
6 ответов

Решение GNU awk, которое рассматривает , или \n как разделитель записей и - как разделитель полей. Проверка равенства или проверка диапазона применяется в зависимости от количества полей

awk -v num=348 -v RS=',|\n' -F'-' 'NF == 2 && $1 <= num && $2 >= num{c++};
           NF == 1 && $0 == num{c++};
           END{print c+0}' file
2
4
27.01.2020, 20:49

Если вы можете использовать perl:

$ perl -F',' -anle '
for (@F) {
    ($l,$h) = split "-";                
    $count++ if $l == 348 || ($l < 348 and $h >= 348);
}
END {print $count}
' file
2
3
27.01.2020, 20:49

В этом примере используется совпадение функций.

awk -F ',' '{num = 348; i = 0; while(i <= NF) {i++; match($i,/([0-9]*)/,arr); if(arr[1] == num || (arr[1] <= num && num <= arr[2])){count++}}}. END {print count}' file

0
27.01.2020, 20:49

Возможный метод решения проблемы (так как я уверен, что есть много способов сделать это) заключается в упрощении проверки числа.

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

Если значение имеет "-", то для проверки разделите два числа на "-". Тогда достаточно просто проверить, больше или равно ли число, которое вы проверяете, первому числу И меньше или равно второму числу. Это будет означать, что оно находится в диапазоне.

Для значений без "-" это простая проверка, чтобы убедиться, что оно равно.

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

0
27.01.2020, 20:49

Если ваш ввод хорошо сформирован, файл со списком и номером в качестве параметра, то это должно работать в PHP:

<?php
$count = 0;
foreach(explode("\n",file_get_contents($argv[1])) as $line)
foreach(explode(",",$line) as $cols)
{
    $data = split(',',$cols);
    if(((count($data)>0)&&($data[0]==$argv[2])) ||
        (count($data)>1)&&(($data[0]-$argv[2])*($data[1]-$argv[2]) < 0))
        count++;
}
echo $count;

поместить код в файл script.php и вызвать его из bash следующим образом:

php script.php testme.txt 348
0
27.01.2020, 20:49

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

awk -v num=348 -F, '{
  for (i=1; i<=NF; i++) {
    if ($i == num || (split($i, a, /-/) == 2 && (a[1] <= num && num <= a[2]))) {
      print $i
    }
  }
}' <<END
200,300,234,340-350,400,360,333-339
409-420
4444-31231231
348
1-400,100-1000
END
340-350
348
1-400
100-1000

Для хихиканья, гольф:

awk -F, '{for(i=1;i<=NF;i++)if($i==n||(split($i,a,/-/)==2&&a[1]<=n&&n<=a[2]))print $i}' n=348 file
2
27.01.2020, 20:49

Теги

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