Извлечение части значения в столбце, который начинается с «+» и заканчивается «=» с помощью сценария оболочки - PullRequest
0 голосов
/ 29 марта 2019

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

cat file.txt

1234 так от 12 + 3 = 15

1235 так от 123 + 4 = 16

1236 так с 1543 + 4 = 16

1237 так с 13 + 4 = 16

1237 так с 13 + 5 = 16

значение результата, которое я ищу: -

1234 3

1235 4

1236 4

1237 9

Я пытался использовать

cat file.txt |grep   " is so so from " | awk '{print $1,substr($6,3,1);}' |awk '{a[$1]+=$2} END {for(i in a) print i,a[i]

но это дает только тогда, когда 6-й столбец имеет постоянную строку.

, чтобы сделать его динамичным, я ищу помощь, где я могу получить часть строки, имеющую значение "+" перед ним и "=" на другом конце.

Мне нужна помощь, где я могу получить часть строки со значением "+" перед ней и "=" на другом конце.

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Как насчет использования awk и регулярного выражения для извлечения интересных столбцов?

cat file.txt | awk 'match($0, /([0-9]+)[^+]*\+([0-9]+)=.*/, a) { print a[1], a[2] }'

выходов

1234 3
1235 4
1236 4
1237 4
1237 5

Правка: Подведение второгостолбец, если первый идентичен, обозначается @eridal:

cat file.txt | awk 'match($0, /([0-9]+)[^+]*\+([0-9]+)=.*/, a) { print a[1], a[2] }' | awk '{ a[$1] += $2 } END { for(i in a) print i, a[i] }'

приводит к

1234 3
1235 4
1236 4
1237 9
1 голос
/ 29 марта 2019

Не ясно, какой у вас входной файл, поэтому я предполагаю, что мой ответ на этот вопрос file.txt:

1234 is so so from 12+3=15
1235 is so so from 123+4=16
1236 is so so from 1543+4=16
1237 is so so from 13+4=16
1237 is so so from 13+5=16

Так что с таким файлом, как ввод, вот как я бы нацелил эти значения

cat file.txt \
  | grep -Po '^[0-9]+.*\+\d'
  | sed -E 's/^([0-9]+)[^+]+\+([0-9]+)/\1 \2/'
  | awk '{ a[$1] += $2 } END { for(i in a) print i, a[i] }'

Как это работает?

  1. grep для извлечения части, которая нас интересует
  2. sed для удаления промежуточного шума
  3. awk для вычисления необходимого результата суммы

Другое решение: просто простая линия, хотя и не такая простая, чтобы ей следовать.

cat file.txt \
  | awk 'match($0, /^([0-9]+)[^+]+\+([0-9]+)/, m) { a[m[1]] += m[2] } END { for(i in a) print i, a[i] }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...