Php 如何从txt文件中的一行中获取第一个单词作为前一行的col1数据

Php 如何从txt文件中的一行中获取第一个单词作为前一行的col1数据,php,awk,cygwin,Php,Awk,Cygwin,我需要第1列中的日期(dd.mm.yy)(如awk$1?)或txt文件中某行的第一个字(格式始终为dd.mm.yy)用作前一行的第1列,以及在第1列的第1行中找到新日期之前的所有下一行,然后,新的日期应该放在前一行的第1列和所有下一行中,直到在第1列中找到新的日期为止 Windows10Pro、Cygwin、PHP7.x 我现在归档(PHP)文件,然后foreach line preg_split(PHP)当前行,使用preg_split_OFFSET_CAPTURE获取单词的数据和位置作为数组

我需要第1列中的日期(dd.mm.yy)(如awk$1?)或txt文件中某行的第一个字(格式始终为dd.mm.yy)用作前一行的第1列,以及在第1列的第1行中找到新日期之前的所有下一行,然后,新的日期应该放在前一行的第1列和所有下一行中,直到在第1列中找到新的日期为止

Windows10Pro、Cygwin、PHP7.x

我现在归档(PHP)文件,然后foreach line 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可以在匹配前后读取行,但是如何在找到日期的行之前,将日期设置为数组(或其他行)中的第一个元素

输入:

XXXXXX
18.05.19
YYYYYYYY
TTTTTTT
uuu
17.05.19
kkkk
GGGGGG

预期输出:
18.05.19 XXXXXXX
18.05.19 YYYYYY
18.05.19 TTTTTTT
17.05.19 UUU
17.05.19 KKK
17.05.19 ggggg

我没有问题将日期附加到日期之后的后续行,但问题是如何将日期附加到前一行,而不是可能存在的日期

编辑:

我忘了说我在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
关于infle.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          
然后,日期不应应用于上一行,而应仅应用于该行和下一行(直到找到新日期,并且it应检查该日期是否是该行上的唯一内容,如果是,则将该日期应用于上一行和下一行等)

所以评论员给出的结果是预期的结果,问题是我无法重现结果

编辑2:

我使用SplFileObject preg_split的PHP方式:

    $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、字nr、字位置和字本身的列


然后使用一些SQL来获取第一个日期,如果找到日期的行只有日期,则使用更多SQL来用此日期更新前一行日期,等等。

这可能就是您要查找的:

$ 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-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!=“”){打印日期,last}last=$1}
>结束{上次打印日期}
> '  18.05.19
>YYYYYYYY
>TTTTTTT
>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
> 17.05.19
>KKKKKKKKK
>GGGGGG
>EOF
18.05.19 XXXXXX
18.05.19 YYYYYYYY
18.05.19 TTTTTTT
17.05.19 UUUU
17.05.19 KKKK
17.05.19 GGGGGG

谢谢你的建议。非常抱歉耽搁了,出现了一些问题。我对问题进行了一些编辑。关于我的解决方案的反馈以及你修改问题的方式将比
有用得多。我对问题进行了一些编辑。
。听起来你希望我去阅读你更新的问题,并尝试找出答案ut发生了什么变化,然后运行我的脚本,试图找出它的行为不符合预期,而不是你只是告诉我,等等。YMMV。祝你好运!我对你的解决方案没有任何反馈,只是我无法产生与你相同的结果,你给出了相同的输入。显然我做错了什么。因此,我很难做到,using PHP,请参见编辑的问题。这种PHP方式并不是我想要的,但由于我的日程安排,我不得不做一些事情。不过,感谢您的努力。
我无法产生相同的结果
就像说
它不起作用
一样有用。我们无法帮您找出如何使它起作用即使如此,这就像告诉你的机械师你的车“坏了”,并希望她能从中修复它。很高兴你用PHP解决了一些问题。谢谢你的建议。非常抱歉耽搁了,出现了一些问题。我对这个问题做了一些编辑。