Мне нужна дата (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 для обновления даты предыдущей строки на эту дату и т. д.