сценарии оболочки unix для поиска и удаления ненужной строки в файле с разделителями в отдельном столбце - PullRequest
0 голосов
/ 10 мая 2018

{У меня есть требование, где файл представляет собой трубу "|"разграничены.Первая строка содержит заголовки, и количество столбцов равно 5.

Мне нужно удалить только строку в 3-м столбце, если она соответствует шаблону.

Также обратите внимание, что 3-й столбец можетсодержат строки с запятыми ,, точкой с запятой ; или двоеточием :, но они никогда не будут содержать канал | (из-за чего мы выбрали разделитель канала).

Входной файл:

COL1|COL2|COL3|COL4|COL5
1|CRIC|IPL|CRIC1:IPL_M1;IPL_M2;TEST_M1,CRIC2:ODI_M1;IPL_M3|C1|D1
2|CRIC|TEST|CRIC1:TEST_M2,CRIC2:ODI_M1;IPL_M1;TEST_M2;IPL_M3;T20_M1|C2|D2

Выходные данные должны изменяться только в COL3, другие столбцы не должны изменяться, т. Е. В COL3 должна присутствовать строка, которая соответствует шаблону 'IPL_'.Любые другие строки, такие как "TEST_M1", "ODI_M1" должны быть равны нулю.И любые нежелательные точки с запятой должны быть удалены.

например

Question - CRIC1:IPL_M1;IPL_M2;TEST_M1,CRIC2:ODI_M1;IPL_M3
result   - CRIC1:IPL_M1;IPL_M2,CRIC2:IPL_M3

Другой сценарий, в котором, если присутствуют только строки, не соответствующие "IPL_", тогда

Question -  CRIC1:TEST_M1,CRIC2:ODI_M1
Result   -  CRIC1:,CRIC2:

Выходной файл:

COL1|COL2|COL3|COL4|COL5
1|CRIC|IPL|CRIC1:IPL_M1;IPL_M2,CRIC2:IPL_M3|C1|D1
2|CRIC|TEST|CRIC1:,CRIC2:IPL_M1;IPL_M3|C2|D2

Основное требование - найти и заменить строку,

INPUT

COL1|COL2|COL3|COL4|COL5
1|A1|A12|A13|A14|A15

Заменить A13 на B13 в столбце 3 (A13 может измениться,Я имею в виду, что мы должны найти любой шаблон, такой как A13)

OUTPUT

COL1|COL2|COL3|COL4|COL5
1|A1|A12|B13|A14|A15

Заранее спасибо.

Переформатировать сценарий в более простых терминах, взяв только 2 столбца, где мне нужно искать «IPL_» и сохранять только те строки, а любую другую строку, например «ODI_M3; TEST_M5», следует удалить

{

I / P:

{

COL1 | COL2

CRIC1 | IPL_M1; IPL_M2; TEST_M1

CRIC2 | ODI_M1; IPL_M3

CRIC3 | ODI_M3; TEST_M5

* CRIC4 | IPL_M5; ODI_M5; IPL_M6

}

O / P:

{

COL1 | COL2

CRIC1 | IPL_M1; IPL_M2

CRIC2 | IPL_M3

CRIC3 |

CRIC4 | IPL_M5; IPL_M6

}

В ожидании ваших ценных предложений.Пожалуйста, помогите, я новичок в этой платформе.

Спасибо, Сакиб}

1 Ответ

0 голосов
/ 11 мая 2018

Если я читаю это правильно (и я не совсем уверен в этом; я иду в основном на приведенных примерах), то это можно сделать относительно разумно с помощью Perl:

#!/usr/bin/perl

while(<>) {
    if($. > 1) {
        local @F = split /\|/;

        $F[3] = join(",", map {
            local @H = split /:/;
            $H[1] = join(";", grep(/IPL_/, split(";", $H[1])));
            join ":", @H;
        } split(/,/, $F[3]));

        $_ = join "|", @F;
    }

    print;
}

Поместите этот код в файл, скажем foo.pl, тогда, если ваши данные находятся в файле data.txt, вы можете запустить

perl -f foo.pl data.txt

Это работает следующим образом:

#!/usr/bin/perl

# Read lines from input (in our case: data.txt)
while(<>) {
    # In all except the first line (the header line):
    if($. > 1) {
        # Apply the transformation. To do this, first split the line into fields
        local @F = split /\|/;

        # Then edit the third field. This has to be read right-to-left at the top
        # level, which is to say: first the field is split along commas, then the
        # tokens are mapped according to the code in the inner block, then they
        # are joined with commas between them again.
        $F[3] = join(",", map {
            # the map block does a similar thing. The inner tokens (e.g.,
            # "CRIC1:IPL_M1;IPL_M2") are split at the colon into the CRIC# part
            # (which is to be unchanged) and the value list we want to edit.
            local @H = split /:/;

            # This value list is again split along semicolons, filtered so that
            # only those elements that match /IPL_/ remain, and then joined with
            # semicolons again.
            $H[1] = join(";", grep(/IPL_/, split(";", $H[1])));

            # The map result is the CRIC# part joined to the edited list with a colon.
            join ":", @H;
        } split(/,/, $F[3]));

        # When all is done, rejoin the outermost fields with pipe characters
        $_ = join "|", @F;
    }

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