我有一个要求,我要从某个工具的输出中获取 .txt 文件,并且我想将其分成三个。
文件中的示例文本:
First line
Second line
23456
45677
45678
Third line
90909
90678
Last line
Z567Z
6787T
预期产出:
-> 文件1.txt
23456
45677
45678
-> 文件2.txt
90909
90678
-> 文件3.txt
Z567Z
5677T
基本上,文件将具有我们想要使用的 5 位数字/字母数字值,其间的文本用作将文件拆分为多个文件的标识符。
我正在寻找使用awk
或sed
命令来执行此操作。
答案1
如果这不是您所需要的:
$ awk '
/^[[:alnum:]]{5}$/ {
if ( !inBlock++ ) {
close(out)
out = "file" (++cnt) ".txt"
}
print > out
next
}
{ inBlock = 0 }
' file
$ head file?.txt
==> file1.txt <==
23456
45677
45678
==> file2.txt <==
90909
90678
==> file3.txt <==
Z567Z
6787T
然后编辑您的问题以提供更清晰的要求和更具代表性的示例输入/输出。
答案2
这是丑陋的一行:
grep -v '[:alpha:]' test.txt | sed "s/^$/==/g" | split -p "=="
注意:这将根据“==”模式生成 3 个或更多文件 (xa*)。
您可以进一步使用 for 循环删除“==”(sed 's/=//g' xa* | grep -v "^$")(如果有)。
答案3
您可以使用 GNU 工具箱中的 grep+csplit
grep -v '\W' < your_file |
csplit --suppress-matched \
-szn1 -f file -b '%d.txt' \
- '/^$/' '{*}'
awk 处于段落模式,其中记录至少由一个空行分隔。
awk -v RS= '
match($0,/\n[[:alnum:]]+(\n|$)/) {
out = "file" NR ".txt"
print substr($0,1+RSTART) > out
close(out)
}
' your_file
使用 GNU sed,我们首先从输入数据生成 sed 代码,然后对其进行操作以生成所需的输出文件。
sed -En '
1{x;s/.*/123/;x;}
/^\w+$/{=;$z;}
/^$/{
G
s/^(.)(.)(.*)/wfile\2.txt\1\3/
P;s/.*\n//;h
}
' your_file | sed -Ee '
:a;N;/\n[0-9]+$/ba
s/\n(.*\n)?([0-9])/,\2/
s/\n//
' - | sed -nf - your_file
输出文件:如果是 csplit,文件编号从零开始。
==> file1.txt <==
23456
45677
45678
==> file2.txt <==
90909
90678
==> file3.txt <==
Z567Z
6787T