根据特定单词转储文件

根据特定单词转储文件

我有一个文件:

begin  
path: good  
take this way  
easier path
end  

begin  
path: bad  
You shouldn't go there  
end

begin  
path: good  
Very smooth   
end

begin  
path: bad  
you may face problem  
end  

基于路径,我必须创建一个文件:

好.txt

begin  
path: good  
take this way
easier path 
end 

begin  
path: good  
Very smooth   
end

仅使用unix像这样的命令就可以吗grep awk sed sort

答案1

最简单的是,假设“路径”记录的格式与所示完全相同,您可以使用awk段落模式

awk '{print > $3".txt"}' RS= ORS='\n\n' file

答案2

您可以在 Linux 上使用许多不同的工具:

  • sh|bash|ksh|csh- 或其他一些外壳
  • awk
  • perl
  • python(取决于它的安装)

或者上述工具的任意组合。

可能的解决方案使用bashsed,请参阅有关限制/假设的注释:

#!/bin/bash
IN_FILE="$1"   ## Argument: test.txt
OUT_FILE=

# See done for
while read LINE
do
    case $LINE in
        begin)
            OUT_FILE=
            ;;

        path:*)
            OUT_FILE=$(echo "$LINE" | sed 's/^path: \(.*\)/\1/g').txt
            ## TODO: Do a first-seen OUT_FILE check and truncate file.
            echo "begin" >> "$OUT_FILE"   # TODO: Write from buffer instead
            echo "$LINE" >> "$OUT_FILE"
            ;;

        *)
            if [ ! -z "$OUT_FILE" ]
            then
                echo "$LINE" >> "$OUT_FILE"
            else
                ## TODO: Append to a buffer
            fi
           ;;
    esac
done < "$IN_FILE"

笔记: 上面的代码产生了预期的输出,但我还没有对其进行审查以确保逻辑完整/无错误。

它还存在以下局限性和问题:

  • .txt即使文件已经存在,也会追加到文件中(可以根据要求添加唯一性检查)
  • 假设先行beginpath:..因此可以忽略输入中的该行并在遇到路径时将其写出。可以创建一个BUFFER变量,但我目前还没有这样做。
  • 它可能缺少对空白​​ OUT_FILE 的一些检查。

相关内容