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

Нет, /usr/bin/python никогда не должен указывать на python3. Похоже, что этот скрипт сломан, и сообщается об ошибке.

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

15 ответов

Используя 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
ответ дан 22 May 2018 в 11:33

Используя 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
ответ дан 17 July 2018 в 17:15

Используя 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 July 2018 в 18:06

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

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

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

6
ответ дан 22 May 2018 в 11:33

Пример с sed

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

Примечания

-n ничего не печатают, пока мы его не попросим (удаляет несогласованные строки) -r use ERE (поэтому нам не нужны обратные слэши для метасимволов + и ( )) [^,]+, некоторые не запятые, за которыми следует запятая ([^,]+),, сохраняющая некоторые не запятые, за которыми следует запятая для более позднего (мы только хочу эту часть) .* любое количество любых символов (избавляется от остальной части строки) \1 сохраненный нами узор p печатает строки, которые мы изменили (необходимо с -n)
5
ответ дан 22 May 2018 в 11:33

Поскольку вы упоминаете 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]
3
ответ дан 22 May 2018 в 11:33
  • 1
    Можно также превратить вывод в строку для печати на stdout для дальнейшей обработки, поскольку список (с скобками и запятыми) может быть нежелательным. Используйте "\n".join(ids) для печати каждого элемента в отдельной строке или " ".join(ids) для списка, разделенного пробелами. – Sergiy Kolodyazhnyy 8 April 2018 в 22:40
  • 2
    @SergiyKolodyazhnyy: OP специально упомянул, что идентификаторы должны быть сохранены как список в python. Вот что делает этот код. Как только его в списке, можно обработать, как вы пожелаете. – Eric Duminil 9 April 2018 в 09:32
  • 3
    Ах, пропустил эту часть. Обычно эти типы вопросов требуют просто извлечь данные и все. Не волнуйтесь, у вас есть хороший ответ. – Sergiy Kolodyazhnyy 9 April 2018 в 10:48

Вы можете использовать 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

. Вышеприведенное расширение распространяется на следующую программу:

2
ответ дан 22 May 2018 в 11:33

Поскольку вы упоминаете 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]
3
ответ дан 17 July 2018 в 17:15

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

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

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

6
ответ дан 17 July 2018 в 17:15

Вы можете использовать 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
ответ дан 17 July 2018 в 17:15

Пример с sed

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

Примечания

-n ничего не печатают, пока мы его не попросим (удаляет несогласованные строки) -r use ERE (поэтому нам не нужны обратные слэши для метасимволов + и ( )) [^,]+, некоторые не запятые, за которыми следует запятая ([^,]+),, сохраняющая некоторые не запятые, за которыми следует запятая для более позднего (мы только хочу эту часть) .* любое количество любых символов (избавляется от остальной части строки) \1 сохраненный нами узор p печатает строки, которые мы изменили (необходимо с -n)
5
ответ дан 17 July 2018 в 17:15

Поскольку вы упоминаете 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]
3
ответ дан 23 July 2018 в 18:06
  • 1
    Можно также превратить вывод в строку для печати на stdout для дальнейшей обработки, поскольку список (с скобками и запятыми) может быть нежелательным. Используйте "\n".join(ids) для печати каждого элемента в отдельной строке или " ".join(ids) для списка, разделенного пробелами. – Sergiy Kolodyazhnyy 8 April 2018 в 22:40
  • 2
    @SergiyKolodyazhnyy: OP специально упомянул, что идентификаторы должны быть сохранены как список в python. Вот что делает этот код. Как только его в списке, можно обработать, как вы пожелаете. – Eric Duminil 9 April 2018 в 09:32
  • 3
    Ах, пропустил эту часть. Обычно эти типы вопросов требуют просто извлечь данные и все. Не волнуйтесь, у вас есть хороший ответ. – Sergiy Kolodyazhnyy 9 April 2018 в 10:48

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

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

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

6
ответ дан 23 July 2018 в 18:06

Вы можете использовать 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 July 2018 в 18:06

Пример с sed

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

Примечания

-n ничего не печатают, пока мы его не попросим (удаляет несогласованные строки) -r use ERE (поэтому нам не нужны обратные слэши для метасимволов + и ( )) [^,]+, некоторые не запятые, за которыми следует запятая ([^,]+),, сохраняющая некоторые не запятые, за которыми следует запятая для более позднего (мы только хочу эту часть) .* любое количество любых символов (избавляется от остальной части строки) \1 сохраненный нами узор p печатает строки, которые мы изменили (необходимо с -n)
5
ответ дан 23 July 2018 в 18:06

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

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