bash - awk:在第 n 次出现定界符时拆分文件,错误的第一个拆分文件

标签 bash awk

我想在每出现 n 个“>”时拆分一个文本文件,就像下面粘贴的文件(抱歉长度)。例如,每第二次出现“>”,但我需要能够更改该数字。

test_split.txt:

>eeefkdfn
a
a
a
>c 4ufjdhf
b
b
b
b
>
c
c
> c
d
d
d
d
d
>3
>cr
>c3
e
e
e
e
e
> 5
f
f
f
f
>cr
g
g
g
g
> cr dkjfddf
h
h
h
h

所以我想要这些输出文件(只显示前两个):

file_1.txt:

>eeefkdfn
a
a
a
>c 4ufjdhf
b
b
b
b

file_2.txt:

>
c
c
> c
d
d
d
d
d

等等

问题:

我一直在尝试使用这个 awk 命令实现该结果:

awk '/^>/ {n++} { file = sprintf("file_%s.txt", int(n/2)); print >> file; }' < test_split.txt

我得到的不是预期的结果,而是正确的输出(拆分)文件,除了第一个文件,它只包含一次“>”(而不是两次),如下所示:

猫测试_0.txt

>eeefkdfn
a
a
a

猫测试_1.txt

>chr1 4ufjdhf
b
b
b
b
>
c
c

知道这是为什么吗?谢谢!

最佳答案

这看起来更简单:

awk 'BEGIN{i=1}/^>/{cont++}cont==3{i++;cont=1}{print > "file_"i".txt"} file

会给你预期的结果:

$ cat file_1.txt
>eeefkdfn
a
a
a
>c 4ufjdhf
b
b
b
b

$ cat file_2.txt
>
c
c
> c
d
d
d
d
d

解释

BEGIN{i=1}:文件计数器初始化。

/^>/{cont++}:计算每个找到的>

cont==3{i++;cont=1}:每三次出现 > 字符增加文件计数器并初始化 cont var,它再次成为第一个.

{print > "file_"i".txt"}:将输出定向到预期的文件。

关于bash - awk:在第 n 次出现定界符时拆分文件,错误的第一个拆分文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301745/

相关文章:

bash - 使用 SSH 和 NFS 在集群上进行并行化的最简单方法是什么?

swift - 使用 swift 找不到 Bash 命令

regex - 使用 bash 按行和列 grep

awk - 将 3 列文件转换为矩阵格式

bash - 实际的 bash 字符串存储 awk 源

bash - 从 shell 脚本的行数中提取公共(public)部分文本

bash - 如何从 "permission denied"中排除所有 "find"消息?

linux - cron 脚本已执行但没有输出

bash - sed 或 awk 替换前 14 个出现的位置

linux - 使用 Awk 和 ifconfig 定义 UNIX 别名和/或函数