Как получить первое слово из строки в текстовом файле, чтобы быть данными col1 на предыдущей строке - PullRequest
0 голосов
/ 18 мая 2019

Мне нужна дата (dd.mm.yy) в столбце 1 (например, awk $ 1?) Или в качестве первого слова (формат всегда dd.mm.yy) в строке в текстовом файле для использования в качестве столбца1 в предыдущей строке и все последующие строки, пока в строке в столбце 1 не будет найдена новая дата, а затем в столбце 1 в предыдущей строке и во всех следующих строках должна быть указана новая дата, пока в столбце не будет найдена новая дата.1 в строке.

Windows 10 Pro, Cygwin, PHP 7.x

Теперь я подаю (PHP) файл, затем передаю строку preg_split (PHP) текущей строки, чтобы получить массивслов и позиций с использованием PREG_SPLIT_OFFSET_CAPTURE для получения данных и позиции слова в виде массива.

Первый элемент в массиве preg_split для строки всегда [0] = "" (пустой) и позиция [1]= 0.Если следующий элемент соответствует «preg_match ('/ [0-9] {2}. [0-9] {2}. [0-9] {2} /', $ element)» и его позиция по крайней мереX, но не более Y, это дата, которую я хочу, чтобы она использовалась в качестве первого элемента для ex в массиве элементов в предыдущей строке, но в предыдущей строке только вверх, в строке, в которой находится дата, и всепоследующие строки, пока в строке не будет найдена новая дата, а затем эта новая дата должна использоваться в качестве даты в предыдущей строке, в которой вместо новой даты будет найдена новая дата ...

Я знаю, что awk можетчитать строки до и после совпадения, но как мне установить дату в качестве первого элемента в массиве (или что-то еще) в строке до строки, в которой найдена дата?

Ввод:

XXXXXX18.05.19YYYYYYYYYYYTTTTTTTUUUUUUUUU17.05.19KKKKKKKKKGGGGGG

Ожидаемый результат:18.05.19 XXXXXXX18.05.19 ГГГГГГГГГ18.05.19 TTTTTTT17.05.19 УУУУУУУУУУУУ17.05.19 KKKKKKKKKK17.05.19 ГГГГГГГ

У меня нет проблем с прикреплением даты к последующим строкам после даты, но проблема в том, как прикрепить дату к предыдущей строке вместо возможно существующей даты.

РЕДАКТИРОВАТЬ:

Я забыл сказать, что у меня Windows + Cygwin.

Исходный файл для чтения имеет несколько пробелов в каждой строке, не знаю, имеет ли это значение.Я удалил их вручную для тестирования, но это не помогло (ниже приведен исходный файл).И первоначальный пример файла для чтения был несколько минимизирован, в реальном файле есть несколько слов в строках, и я нуждаюсь в них всех (я полагаю, это можно сделать, используя $ 0).

Этото, что я пробовал

    #!/bin/bash
    awk '/^([0-9]{2}\.){2}[0-9]{2}/ { date=$1; next }
    NR>1 { print date, prev }
    { prev=$1 }
    END { print date, prev }' Infile.txt

на Infile.txt

    TTTTT 15MIKROG/ML
    13.11.12            
    90X0.3ML
    D. xxx yyy     
    S. 1 drop 1/d     
    LKE KJJKJJKJK    
    TTTTT 15MIKROG/ML
    22.05.12            
    90X0.3ML
    D. cccc kkkk 
    S. 1 tip 1/d MMMMM LLLLL 
    GGGGG HHHHHH                
    05.10.11   MEDFG 2.5ML          
    D. xxx ooo                   
    S. 1 TIP 1/d MMMMM SSSS 
    GGGGGG HHHHHHH                
    CVCVCVC 20MG/ML+5MG/ML             
    03.03.11
    60X0.2ML                          

На строках, содержащих дату, эту дату следует применять, как сказано, к предыдущей строке и последующим строкам до новой даты

Но если у даты есть что-то (что-либо, кроме пробелов) после нее в той же строке, здесь только строка

    05.10.11   MEDFG 2.5ML          

, тогда дата не должна применяться к предыдущейстрока, но только для этой строки и следующих строк (пока не будет найдена новая дата, и она должна проверить, является ли дата единственной вещью в строке, и, если это так, применить дату к предыдущей строке и последующей строке и т. д..

Таким образом, результат, представленный комментаторами, является ожидаемым результатом, дело в том, что я не могу воспроизвести результат.

РЕДАКТИРОВАТЬ 2:

PHP, как я это сделал, используя SplFileObject, preg_split:

    $splFileObjectFile=new SplFileObject($theFileToProcess);

    foreach($splFileObjectFile as $lineNr=>$lineContent)
        {
        $lineContentArr = preg_split('/ {2,}/', $lineContent, -1, PREG_SPLIT_OFFSET_CAPTURE);
        // To database
        foreach($lineContentArr as $wdKey=>$wordData)
            {
            $wordNr=$wdKey;
            $dataValue=$wordData[0];
            $posValue=$wordData[1];
            $lineNr=$lineNr;
            ...

Используя SplFileObject, я получил номер строки, и с preg_split на каждые 2 или более пробелов я получил слова в строке в массиве подмассивов, в каждом из которых само слово и его позицияв строке.

Все это вставляется в базу данных временного SQLite3 со столбцами для строки nr, word nr, позиции слова и самого слова.

Затем некоторый SQL для получения первой даты, еслив строке, в которой была найдена дата, не было ничего, кроме даты, больше SQL для обновления даты предыдущей строки на эту дату и т. д.

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Это может быть то, что вы ищете:

$ awk '
    /^([0-9]{2}\.){2}[0-9]{2}/ { date=$1; next }
    NR>1 { print date, prev }
    { prev=$1 }
    END { print date, prev }
' file
18.05.19 XXXXXX
18.05.19 YYYYYYYYYYY
18.05.19 TTTTTTT
17.05.19 UUUUUUUUU
17.05.19 KKKKKKKKK
17.05.19 GGGGGG
0 голосов
/ 18 мая 2019

Я думаю, что Эд победил меня, но хорошее упражнение.

/^[0-9]{2}.[0-9]{2}.[0-9]{2}$/ {date=$1; next}
{if(last!="") {print date, last} last=$1}
END {print date, last}
awk '
>   /^[0-9]{2}.[0-9]{2}.[0-9]{2}$/ {date=$1; next}
>   {if(last!="") {print date, last} last=$1}
>   END {print date, last}
> ' <<EOF
>                    XXXXXX
> 18.05.19
>                    YYYYYYYYYYY
>                    TTTTTTT
>                    UUUUUUUUU
> 17.05.19
>                    KKKKKKKKK
>                    GGGGGG
> EOF
18.05.19 XXXXXX
18.05.19 YYYYYYYYYYY
18.05.19 TTTTTTT
17.05.19 UUUUUUUUU
17.05.19 KKKKKKKKK
17.05.19 GGGGGG
...