【问题标题】:Extract data from txt file and create new file based on specific text dynamically从txt文件中提取数据并根据特定文本动态创建新文件
【发布时间】:2018-04-25 11:13:39
【问题描述】:

我的文件如下 猫Data.txt

****************** abc.txt - Starting point  ********************
abc
asd
asad
asfkn
sadjn
****************** abc.txt - End point  ********************
****************** def.txt - Starting point  ********************
fjhdsf
sdjnbs
askd
akdsn
dhskn
****************** def.txt - End point  ********************
****************** xyz.txt - Starting point  ********************
akdsnaskd
sakdnbasd
akjsndb
askjdb
akdsnb
****************** xyz.txt - End point  ********************

我想根据起点和终点动态创建多个文件。

我需要的输出是上述案例 3 文件:abc.txt ,def.txt ,xyz.txt

>> cat abc.txt 
abc
asd
asad
asfkn
sadjn

>> cat def.txt 
fjhdsf
sdjnbs
askd
akdsn
dhskn

你能帮我一个 unix 命令来做这个吗?

【问题讨论】:

  • 您好,欢迎来到 SO。到目前为止你尝试了什么?你能向我们展示你的作品吗?此外,您可能想参观stackoverflow.com/tour - 它会给您一些关于这个网站的线索。谢谢你:)

标签: shell unix awk sed


【解决方案1】:

这是一个易于阅读的解决方案,带有Bashgrep

#!/bin/bash

while read line ; do
if FILE=$(grep -P -o '[a-z]*\.txt(?= - Starting)' <<< "$line"); then
F="$FILE"
fi
if ! grep '\*\*\*\*' <<< "$line" ; then
echo "$line" >> "$F"
fi
done

结果如下

$ cat file.txt
****************** abc.txt - Starting point  ********************
abc
asd
asad
asfkn
sadjn
****************** abc.txt - End point  ********************
****************** def.txt - Starting point  ********************
fjhdsf
sdjnbs
askd
akdsn
dhskn
****************** def.txt - End point  ********************
****************** xyz.txt - Starting point  ********************
akdsnaskd
sakdnbasd
akjsndb
askjdb
akdsnb
****************** xyz.txt - End point  ********************
$ cat file.txt | ./go.sh
****************** abc.txt - Starting point  ********************
****************** abc.txt - End point  ********************
****************** def.txt - Starting point  ********************
****************** def.txt - End point  ********************
****************** xyz.txt - Starting point  ********************
****************** xyz.txt - End point  ********************
$ cat abc.txt
abc
asd
asad
asfkn
sadjn
$ cat def.txt
fjhdsf
sdjnbs
askd
akdsn
dhskn
$ cat xyz.txt
akdsnaskd
sakdnbasd
akjsndb
askjdb
akdsnb

【讨论】:

    【解决方案2】:

    这是一个 AWK 解决方案:

    awk '/^(\*[ ]*)+/ {
        gsub(/(\*[ ]*)+/,"")
        match($0,/[ ]*-[ ]*Starting point/)
        if(RLENGTH>0) fn=substr($0,1,RSTART-1)
        next
    }
    fn { print $0 > fn }' Data.txt
    

    假设“终点”和“起点”之间没有线。

    结果:

    $ cat abc.txt
    abc
    asd
    asad
    asfkn
    sadjn
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2022-11-15
      • 2014-09-17
      相关资源
      最近更新 更多