Разбор текста из .txt файлов - PullRequest
0 голосов
/ 04 июля 2019

У меня есть файл журнала с вкладками, но мне нужно всего несколько символов строки, отмеченной в начале 30.10.

Использование команды awk '/^30.10/ enjprint}' FOOD_ORDERS_201907041307.DEL

я получаю этот вывод 30.1006 35470015000205910002019070420190705 00000014870000000034

30.1006   35470015000205900002019070420190705                                             00000014890000000029

30.1006   35470023000205920002019070420190705                                             00000014900000000011

Мне нужно извлечь 3547 и последние n-ые символы с самого конца после нулей. Итак, ожидаемый результат будет: 3547 34 29 11 Но если последние 10 символов содержат ведущие нули и число, мне нужно это число

Ответы [ 3 ]

1 голос
/ 04 июля 2019

Вот простой awk скрипт для выполнения задачи:

script.awk

/^30.10/ {    # for each line starting with 30.10
    last2chars = substr($3, length($3)-1);  # extract last 2 chars from 3rd field into variable last2chars
    if($3 ~ /00001143$/) last2chars = 1143; # if 3rd field ends with 1143, update variable last2chars respectively
    print last2chars;  # output variable last2chars
}

input.txt

30.1006 35470015000205910002019070420190705 00000014870000000034
30.1006 35470015000205900002019070420190705 00000014890000001143
30.1006 35470015000205900002019070420190705 00000014890000000029
30.1006 35470023000205920002019070420190705 00000014900000000011

работает:

 awk -f script.awk input.txt

outupt:

34
1143
29
11
1 голос
/ 05 июля 2019

Хотя ваш вопрос неясен, ваш ответ на комментарий Эда Мортона дает немного больше ясности относительно того, чего вы пытаетесь достичь. Где это все еще неясно, это именно то, что вы хотите от третьего поля. Судя по вашему вопросу и различным комментариям, появляется, если строка начинается с 30.10, вы хотите получить первое 4-digits из второго поля и вам нужны самые правые цифры, [1-9] из третьего поля.

Если это точно отражает то, что вам нужно, то awk с комбинацией строковых функций substr, match и length может выделить интересующие вас цифры. Например:

awk '/^30.10/ { 
    l=match ($3, /[1-9]+$/)
    print substr ($2, 1, 4) " " substr ($3, l, length($3)-l+1)
}' test

Примет входной файл (заимствованный из ответа Дуди Боя), например,

$ cat test
30.1006 35470015000205910002019070420190705 00000014870000000034
30.1006 35470015000205900002019070420190705 00000014890000001143
30.1006 35470015000205900002019070420190705 00000014890000000029
30.1006 35470023000205920002019070420190705 00000014900000000011

и вернемся к вам:

3547 34
3547 1143
3547 29
3547 11

Дайте мне знать, точно ли это отражает то, что вам нужно.

0 голосов
/ 04 июля 2019

ПОЛУЧИЛО часть этого! awk '/^30.10/ enjprint}' FOOD_ORDERS_201907041307.DEL | sed 's /.* (..) / \ 1 /'

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