Команда Grep и Pipe для извлечения чисел

В репозитории находится файл trial.txt со следующим текстом:

    Determining Coefficients
    Average Tractions
      trial 1 xyzt 1.987213
      trial 2 xyzt 1.131322
      trial 3 xyzt 1.123132
    trial for abc 1
      1.473248 2.027327
    trial for abc 2
      2.043960 2.043960
    trial for abc 3
      2.027327 1.473248

Я пытаюсь найти однострочное выражение с помощью grep и pipe вместе с регулярными выражениями, которое извлечет Только числовые значения для 1-й и 3-й строк после текста trial for abC# из файла. Результат после выполнения команды должен быть:

    1.473248 2.027327
    2.027327 1.473248

Благодарю, если кто-нибудь может помочь! Спасибо.

Пожалуйста, избегайте вопросов "Дай мне код". Вместо этого покажите сценарий, над которым вы работаете, и укажите, в чем проблема. Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?

jww 09.09.2018 00:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
375
4

Ответы 4

Для этого вам не нужны grep или какие-либо конвейерные процессы ...

sed -ne '/trial for abc [0-9]\+/{n;p}' trial.txt

Параметр -n запрещает sed автоматически распечатывать каждую строку, и для каждой строки, соответствующей регулярному выражению, запускаются команды n и p. n считывает следующую строку в пространстве шаблонов sed, а p распечатывает ее.

Спасибо. Но на этот раз, к сожалению, мне пришлось сделать это с помощью grep.

Sercan Gul 08.09.2018 21:10

Пожалуйста, избегайте ответов "Дай мне код". Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?

jww 09.09.2018 00:10

Это работает для меня

➜  /tmp cat trial.txt | grep "^[ .0-9]*$"
      1.473248 2.027327
      2.043960 2.043960
      2.027327 1.473248

"^" marks the beginning of the line.

"[ .0-9]*" allows only spaces, periods and digits.

"$" marks the end of the line.

Это выражение НЕ идеально и в целом принимает множество других строк, но является самым простым, отклоняющим все нежелательные строки в текстовом файле.

Другая версия, которая отклоняет все строки, содержащие любой алфавит

➜  /tmp grep -v "[[:alpha:]]" trial.txt
      1.473248 2.027327
      2.043960 2.043960
      2.027327 1.473248

не гарантирует, что строка с цифрами находится после trial for abc

Philipp Grigoryev 08.09.2018 21:18

@PhilippGrigoryev Согласен. Это то, что будет работать ТОЛЬКО для этой конкретной файловой структуры при условии, что остальная часть файла похожа.

lakshayg 08.09.2018 21:19

что, если мне нужны только первая и третья строки, как мне изменить строку?

Sercan Gul 08.09.2018 21:21

@SercanGul Какой узор вы ищете?

lakshayg 08.09.2018 21:23

Я пытаюсь распечатать только числа в строке, в которой одна константа меньше 2. Например, числа в первой и третьей строках.

Sercan Gul 08.09.2018 21:28

Вы готовы использовать awk?

lakshayg 08.09.2018 21:30

Вы можете перенаправить вывод любого из вышеуказанных grep в grep "[0-1]\.", предполагая, что нет чисел -ve.

lakshayg 08.09.2018 21:34

на самом деле это звучит хорошо. большое спасибо!

Sercan Gul 08.09.2018 22:08

grep -A1 "sifs for crack" "sifs.txt" | grep -v "sifs для крэка" | grep -v "2.043960"

Sercan Gul 08.09.2018 22:41

Это работает для меня, используя только grep и трубы, как вы просили:

grep -A1 "trial for" "trial.txt" | grep -v "trial for"

Что он делает, так это ищет слова «испытание для» и печатает строку после этого, а затем перенаправляет ее на другой grep, который удаляет строки, содержащие «испытание для» печати только правильных сумм / чисел.

Пожалуйста, избегайте ответов "Дай мне код". Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?

jww 09.09.2018 00:09

Спасибо! Позже я понял, что этот пост был для какого-то теста, как раз тогда, когда OP много раз менял основной вопрос

Gustavo Topete 09.09.2018 08:02
 grep -A 1 'trial for abc' /tmp/1 | grep '^[0-9. ]+$'

работает для меня, где -A 1 должен печатать 1 строку после строки привязки, а следующий grep - выбрать строку с числами из результата

Пожалуйста, избегайте ответов "Дай мне код". Также см. Сколько исследовательских усилий ожидается от пользователей Stack Overflow?

jww 09.09.2018 00:10

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