2016-03-28 99 views
4

我有两个文件,我试图从file2插入一行到file1,每隔4行从file1的开始处开始。因此,例如:shell每隔n行插入一行

文件1:

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

文件2:

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 ~ 
+0

读碟从另一个文件。在这种情况下,file1 – jeabesli

+0

您是否也可以显示'file1'的样本数据? – anubhava

+1

我编辑了这个问题,因为我的文件混淆了 – jeabesli

回答

2

通过这两个文件下面的步骤,而无需装载任何一个到一个数组存储:

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

如果您的实际file2比你想的内存来容纳更大的东西,这可能是可取的。

这种分解如下:

  • (NR-1)%4==0 - 从0开始
  • getline this<"file2"一个其中每4号线相匹配的条件 - 从“文件2”,并将其存储在变量this
  • 得到一个线print this - 打印...这个。
  • 1 - 简写为“打印当前行”,在这种情况下,来自文件1(AWK的正常输入)
+0

非常感谢 – jeabesli

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插入一行并增加索引计数器。我们打印file1的行。
-1

下面是与pastetr

paste file2 <(paste - - - - <file1) | tr '\t' '\n' 

做一个愚蠢的方法假设您的输入文件中没有任何实际的选项卡。

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 
2

这可能会为你工作(GNU SED):

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

或只使用猫和粘贴:

cat file1 | paste -d\\n file2 - - - -