shell每隔n行插入一行

时间:2016-03-28 19:16:22

标签: file shell awk

我有两个文件,我试图从file2插入一行,每隔4行从file1插入一行到file1。例如:

文件1:

line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

file2的:

50
43
21

输出我想得到:

50
line 1
line 2
line 3
line 4
43
line 5
line 6
line 7
line 8
21
line 9
line 10

我的代码:

while read line
do
    sed '0~4 s/$/$line/g' < file1.txt > file2.txt
done < file1.txt

我收到以下错误:

sed: 1: "0~4 s/$/$line/g": invalid command code ~

5 个答案:

答案 0 :(得分:2)

使用awk执行此操作很容易:

awk 'FNR==NR{a[i++]=$0; next} !((FNR-1) % 4){print a[j++]} 1' file2 file1

50
line 1
line 2
line 3
line 4
43
line 5
line 6
line 7
line 8
21
line 9
line 10
  • 在处理输入中的第一个文件,即file2时,我们将每个行都存储在数组中,并将键作为以0开头的递增数字存储。
  • 在输入中处理第二个文件,即file1时,我们使用模运算检查当前记录#是否可被4整除,如果是,则从file2插入一行并增加index counter。
  • 最后使用操作1,我们打印file1
  • 中的行

答案 1 :(得分:2)

以下步骤浏览两个文件,而不将其中任何一个加载到内存中的数组中:

awk '(NR-1)%4==0{getline this<"file2";print this} 1' file1

如果您的实际file2大于您希望在内存中保留的内容,则可能更为可取。

这分解如下:

  • (NR-1)%4==0 - 一个匹配从0
  • 开始的每4行的条件
  • getline this<"file2" - 从&#34; file2&#34;获取一行并将其存储在变量this
  • print this - 打印......这个。
  • 1 - 简写&#34;打印当前行&#34;,在这种情况下来自file1(awk&#39;正常输入)

答案 2 :(得分:2)

这可能适合你(GNU sed):

collect

或者只使用cat and paste:

sed -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' -e 'Rfile1' file2

答案 3 :(得分:1)

使用unix工具链的另一种替代方法

$ paste file2 <(pr -4ats file1) | tr '\t' '\n'

50
line 1
line 2
line 3
line 4
43
line 5
line 6
line 7
line 8
21
line 9
line 10

答案 4 :(得分:-1)

使用pastetr

进行此操作是一种愚蠢的方法
paste file2 <(paste - - - - <file1) | tr '\t' '\n'

假设您的输入文件中没有任何实际标签。