Извлеките число в txt файле при помощи регулярных выражений

Я сохраняю вывод терминала 2>&1 | tee ./ results.txt в a .txt файл, который имеет следующий текст:

executing: ./home/images/image-001-041.png
0,33, /results/image-001-041.png
1.7828,32, /results/image-001-040.png
1.86051,34, /results/image-001-042.png
1.90462,31, /results/image-001-039.png
1.90954,30, /results/image-001-038.png
1.91953,35, /results/image-001-043.png
1.92677,28, /results/image-001-036.png
1.92723,3160, /results/image-037-035.png
1.93353,7450, /results/image-086-035.png
1.93375,1600, /results/image-019-044.png

Я должен взять вторые числа (после того, как первый знак запятой, т.е. 33,32,34...), и сохраните его в списке в Python. Какова команда удара или команда регулярного выражения в Python?Спасибо

5
задан 8 April 2018 в 00:37

5 ответов

Используя cut:

cut -sd',' -f2 < result.txt

из man cut :

-d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter
-s, --only-delimited
          do not print lines not containing delimiters
-f, --fields=LIST
          select only these fields;  also print any line that contains
          no delimiter character, unless the -s option is specified
11
ответ дан 23 November 2019 в 08:38

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

awk -F ',' '{print $2}' results.txt

Определить запятую в качестве разделителя полей и напечатать второй столбец.

6
ответ дан 23 November 2019 в 08:38

Пример с sed

$ sed -rn 's/[^,]+,([^,]+),.*/\1/p' results.txt
33
32
34
31
30
35
28
3160
7450
1600

Примечания

  • -n ничего не печатайте, пока мы не просим его (удаляет несогласующие отрезки длинной линии),
  • -r используйте ДО (таким образом, нам не нужны обратные косые черты для + и ( ) метасимволы)
  • [^,]+, некоторые незапятые сопровождаются запятой
  • ([^,]+), сохраните некоторые незапятые, сопровождаемые запятой на потом (мы только хотим эту часть),
  • .* любое количество любых символов (избавляется от остальной части строки),
  • \1 шаблон мы сохранили
  • p распечатайте строки, которые мы изменили (необходимый с -n)
5
ответ дан 23 November 2019 в 08:38

Так как Вы упоминаете Python:

with open('results.txt') as results:
    ids = [int(line.split(',')[1]) for line in results if ',' in line]
    print(ids)

Это создает список целых чисел как ids, и дисплеи это:

[33, 32, 34, 31, 30, 35, 28, 3160, 7450, 1600]
4
ответ дан 23 November 2019 в 08:38

Можно использовать Perl, который подобен awk и sed отправленным решениям.

-a включает автоматическое разделение на каждой строке.

-F используется для определения разделителя для разделения каждой строки. Это принимает значение по умолчанию к ''. Затем результат хранится в @F. Следовательно $F [1] дает нам второй столбец.

-l удостоверяется, что новая строка добавляется к каждой строке.

-e используется для определения команды, которую мы должны выполнить на каждой строке, которая является печатью

$ perl -F, -ale 'print $F[1]' results.txt
33
32
34
31
30
35
28
3160
7450
1600

Вышеупомянутое расширяется до ниже программы:

$ perl -MO=Deparse -F, -ale 'print $F[1]' results.txt
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = readline ARGV)) {
    chomp $_;
    our @F = split(/,/, $_, 0);
    print $F[1];
}
-e syntax OK
2
ответ дан 23 November 2019 в 08:38

Другие вопросы по тегам:

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