每 n 行插入一个字符串,同时将行计数器重置为所需的字符串

Insert String every n lines, while also resetting line counter at desired string

我需要读取一个文本文件并每 n 行插入一个字符串,而且当我遇到 header 字符串时还需要重新启动行计数器。

行每 3 行重复一次,使用代码:

sed '0~3 s/$/\nINSERT/g' < INPUT/PATH/FILE_NAME.txt > OUTPUT/PATH/FILE_NAME.txt

我似乎找不到如何在行=Header 时重新启动计数器...我也曾尝试使用 shell 命令,但收效甚微。

例如。输入:

 1. Header Line Here 
 2. dog 
 3. cat
 4. fish
 5. pony
 6. horse
 8. bird
 7. Header Line Here
 8. whale
 9. Header Line Here 
 10. shark
 11. lizard
 12. dolphin

要求输出:

 1. Header Line Here 
 2. dog 
 3. cat
 4. INSERT
 5. fish
 6. pony
 7. horse
 8. INSERT
 9. bird
 10. Header Line Here
 11. whale
 12. Header Line Here 
 13. shark
 14. lizard
 15. INSERT
 16. dolphin
perl -pE'$a=1if/Header Line Here/;say"INSERT"unless$a++%3' file.txt

您可以使用 awk 轻松完成此操作:

awk '
  {print;++n}
  /Header Line Here/ {n=1}
  n==3 {print "INSERT";n=0}
'

假设每4行需要INSERT(取n的值为4)

这可以很容易地使用 awk

实现
awk '/Header/{flag=1} !(flag++%4){print "INSERT"}1' 

它有什么作用?

  • /Header/{flag=1} 如果该行匹配模式 Header,则将 flag 设置为 1

  • !(flag++%4){print "INSERT"} 缺少 flag%4 == 0 然后 print INSERT

  • 1 始终为真,采用默认操作打印整个 record/line(另一个 awk 成语)


测试

$ cat input
Header Line Here 
dog 
cat
fish
pony
horse
bird
fish
Header Line Here
whale
Header Line Here 
shark
lizard
dolphin

$ awk '/Header/{flag=1} !(flag++%4){print "INSERT"}1' input
Header Line Here 
dog 
cat
INSERT
fish
pony
horse
bird
INSERT
fish
Header Line Here
whale
Header Line Here 
shark
lizard
INSERT
dolphin