2

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

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

文件2

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

结果

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

是否有任何“sed”或“awk”一个班轮可以做到这一点?

4

3 回答 3

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

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

于 2013-06-21T20:47:34.477 回答
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不是解决方案的组成部分,仅用于说明。

于 2013-06-21T20:20:04.090 回答
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
于 2013-06-21T18:16:54.680 回答