我有两个文件,我试图从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 ~
答案 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 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)
使用paste
和tr
paste file2 <(paste - - - - <file1) | tr '\t' '\n'
假设您的输入文件中没有任何实际标签。