Получить значения из журнала в CSV - PullRequest
0 голосов
/ 18 октября 2019

У меня проблема с получением большего количества переменных для столбца, чем 4, в мой CSV-файл с помощью скрипта

cat $1 |
grep "SomeText" |
sed -e "s/^.*var1: \([0-9]*\)\/\([0-9]*\), var2: \([0-9]*\)\/\([0-9]*\), var3: \([0-9]*\)\/\([0-9]*\), var4: \([0-9]*\)\/\([0-9]*\), var5: \([0-9]*\)\/\([0-9]*\), var6: \([0-9]*\)\/\([0-9]*\).*/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12/g" | 
awk "{ printf(\"%d;%d;%d;%d;%d;%d\\n\", 
    \$1*4294967296+\$2, 
    \$3*4294967296+\$4, 
    \$5*4294967296+\$6, 
    \$7*4294967296+\$8,
    \$9*4294967296+\$10,
    \$11*4294967296+\$12); }" > $1.csv

из журнала, который выглядит как

...
...
19/10/17 11:10:54 SomeText: var1: 0/1538614, var2: 0/1544404, var3: 0/99989, var4: 0/1312988, var5: 0/1312988, var6: 0/1212940
19/10/17 11:10:55 SomeText: var1: 0/2338726, var2: 0/2344516, var3: 0/899999, var4: 0/2113073, var5: 0/2113073, var6: 0/2012977
...
...

Первые 4 переменные простохорошо, все значения var1 сохраняются в первом столбце, значения var2 - во втором столбце и т. д. Проблема начинается с пятого var. Я не могу понять, как ее решить, но я думаю, что проблема в этой части скрипта

.*/\1 \2 \3 \4 \5 \6 \7 \8 \9 \10 \11 \12

, где необходимо использовать escape-символ или что-то подобное для чисел с двумя цифрами (10+)?

Редактировать: Ожидаемый результат

  ...     ...    ...     ...     ...     ...
  ...     ...    ...     ...     ...     ...
1538614 1544404 99989  1312988 1312988 1212940
2338726 2344516 899999 2113073 2113073 2012977
  ...     ...    ...     ...     ...     ...
  ...     ...    ...     ...     ...     ...

Спасибо за любую помощь или совет, спасибо.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Один в awk. При отсутствии ожидаемого результата это может или не может быть тем, что вы хотели :

$ awk '
/SomeText/ {                                     # $3~/^SomeText/ maybe?
    for(i=5;i<=15;i+=2) {                        # fields $5,$7,$9,...,$15
        split($i,a,"/")                          # split by /
        b=b (b==""?"":OFS) a[1]*4294967296+a[2]  # calculate some, buffer to b
    }
    print b                                      # print buffer
    b=""                                         # reset buffer
}' file

Вывод:

1538614 1544404 99989 1312988 1312988 1212940
2338726 2344516 899999 2113073 2113073 2012977
0 голосов
/ 18 октября 2019

Допустимые обратные ссылки в sed: \1, \2, ..., \9. Ваша попытка использовать \10 \11 \12 не работает, например, \10 интерпретируется как \1, за которым следует литерал 0.

Вам необходимо заменить инструмент на что-то более мощное, например, Perl:

perl -ne '(@groups = m/: ([0-9]*)\/([0-9]*)/g) && print(join(" ", @groups), "\n")'

Учитывая ваш пример ввода, вы получите следующие строки:

0 1538614 0 1544404 0 99989 0 1312988 0 1312988 0 1212940
0 2338726 0 2344516 0 899999 0 2113073 0 2113073 0 2012977

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

Некоторые примеры:

  • grep foo | sed -e 's/.../.../' следует заменить на sed -e '/foo/s/.../.../'
  • grep foo | awk '{ ... }' заменить на awk '/foo/ { ... }'

cat filename | grep pattern следует заменить на grep pattern filename.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...