在第一个文本文件中插入第(n * 5)行,使用另一个文本文件中的第n行

时间:2013-06-21 17:34:25

标签: insert sed apt

我想在file1中插入每行(第n * 5)行,其中包含来自file2(n = 0..m)的第n行的内容。例: 文件1

1: blabla1
2: blabla2
3: ddddd
4: sddddd
5: ffffff
6: hhhhh
...

file2的

1: name1
2: name2
3: name3
...

结果

1: name1
2: blabla1
3: blabla2
4: ddddd
5: sddddd
6: ffffff
7: name2
8: hhhhh
...

是否有任何“sed”或“awk”内衬可以做到这一点?

3 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -re ':a;Rfile1' -e 'x;s/^/./;/.{5}/!{x;ba};s/.*//;x' file2

或:

sed -e '1~5{h;Rfile2' -e 'd};2~5{x;p;x}' file1

但是我注意到第二个解决方案可能存在文件结束问题。

答案 1 :(得分:1)

这个怎么样:

awk '
NR==FNR{a[NR]=$2;next}
{print ++x": "$2;while(++i%5){print ++x": "a[i]};print ++x": "a[i]}' file1 file2

输出:

1: name1
2: blabla1
3: blabla2
4: ddddd
5: sddddd
6: ffffff
7: name2
8: hhhhh

答案 2 :(得分:1)

bash解决方案。我在file1中添加了几行效果

exec 4<file1
while IFS= read -r line; do
    echo "$line"
    for i in {1..5}; do
        IFS= read -r line <&4 || break
        echo "$line"
    done
done < file2 | cat -n
exec 4<&-
 1  name1
 2  blabla1
 3  blabla2
 4  ddddd
 5  sddddd
 6  ffffff
 7  name2
 8  hhhhh
 9  gggg
10  iiii
11  jjjj
12  kkkk
13  name3
14  llll

这会产生相同的输出:

awk 'NR%5 == 1 {getline f2 < "file2"; print f2} 1' file1 | cat -n

显然,cat -n的管道不是解决方案的组成部分,仅用于说明。