我有一个文件:
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
(取决于它的安装)
或者上述工具的任意组合。
可能的解决方案使用bash
和sed
,请参阅有关限制/假设的注释:
#!/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
即使文件已经存在,也会追加到文件中(可以根据要求添加唯一性检查)- 假设先行
begin
,path:..
因此可以忽略输入中的该行并在遇到路径时将其写出。可以创建一个BUFFER
变量,但我目前还没有这样做。 - 它可能缺少对空白 OUT_FILE 的一些检查。