双新行作为 awk 和 tail 函数中的分隔符

Double new line as delimiter in awk and tail function

我需要分离一个如下所示的文本文件

1
00:01:03:321 --> 00:01:04:321
 Randomtext1

2
00:02:03:321 --> 00:03:04:321
 Randomtext2
Still random text2
3rd line of randomtext2

3
00:04:03:321 --> 00:05:04:321
 Randomtext3
Stillrand

块包括序号行、定时器行、内容行然后 删除序号行。 通过将代码分成这样的块,我的意思是我想将所有这些行作为 1 条记录(因此删除前两行(纯新行和序号行)可能更容易) 这是代码:

#!/bin/bash
name=text.sub
name2=text2.sub
awk '
BEGIN {FS="\n\n";

}
{ 
tail -n+1 ;

}' $name > $name2

预期输出将是

00:01:03:321 --> 00:01:04:321
 Randomtext1
00:02:03:321 --> 00:03:04:321
 Randomtext2
Still random text2
3rd line of randomtext2
00:04:03:321 --> 00:05:04:321
 Randomtext3
Stillrand

您可以使用此 awk 脚本执行此操作:

script.awk

BEGIN { FS = "\n"
        RS = "\n\n" 
      }

      { print 
        print  
      }

运行 像这样:awk -f script.awk text.sub > text2.sub

通过将字段分隔符 FS 定义为换行符并将记录分隔符 RS 定义为双换行符,我们将字段转换为通常的 , , .

我会像这样对待每个部分:

1
00:01:03:321 --> 00:01:04:321
 Randomtext1

作为个人记录。

您可以使用记录和字段分隔符来实现这一点,如下所示:

awk '{=""}1' RS='' FS='\n' OFS='\n' file
  • RS='' 是输入记录分隔符。 ''有特殊的含义,表示\n\n
  • FS='\n' 设置输入域分隔符为换行符
  • OFS=\n` 将输出字段分隔符设置为换行符

程序 {=""} 擦除第一个字段(数字)并 1 打印记录。

输入

1
00:01:03:321 --> 00:01:04:321
 Randomtext1

2
00:02:03:321 --> 00:03:04:321
 Randomtext2

脚本

 awk 'BEGIN{RS="";FS="\n"}{printf "%s\n%s\n",,}' file

输出

00:01:03:321 --> 00:01:04:321
 Randomtext1
00:02:03:321 --> 00:03:04:321
 Randomtext2
$ awk 'NR%4~/^[23]$/' file
00:01:03:321 --> 00:01:04:321
 Randomtext1
00:02:03:321 --> 00:03:04:321
 Randomtext2

如果这不是您想要的,请编辑您的问题以提供更真实的样本 input/output。

这个怎么样

$ sed -n '2~4p;3~4p' file

00:01:03:321 --> 00:01:04:321
 Randomtext1
00:02:03:321 --> 00:03:04:321
 Randomtext2

从第 2 行和第 3 行开始每 4 行打印一次。

我不确定你到底想做什么,但根据你想要的输出,这个命令产生相同的结果:

awk '!/^[0-9]*$/' text.sub