如何在任何情况下将文本插入空行?

时间:2017-02-12 15:31:40

标签: bash text awk sed

我想将File2的文字粘贴到File1

File1中:

1
2

4
5

7
8

文件2:

3
6

输出:

1
2
3
4
5
6
7
8

作为示例尝试此问题Insert text into blank lines in bash

sed -e '/^$/{R file2' -e 'd}' file1

但它仅适用于只有每隔一行空白的情况。我想问一下,在更复杂的情况下,它可能吗?换句话说,是否存在通用解决方案?

例如:

File1中

1
2
3

5
6


9

文件2

4
7
8

输出

1
2
3
4
5
6
7
8
9

4 个答案:

答案 0 :(得分:3)

你可以尝试这个awk脚本:

<强> script.awk

FNR == NR  { repl[ ++i ] = $0;  next; }
NF == 0    { print repl[ ++j ]; next; }
1

运行方式如下:awk -f script.awk File2 File1

<强>解释

  • 条件FNR == NR的第一行仅在读取作为参数给出的第一个文件时执行。这是File2。它将替换行存储在repl中,并根据File2声明从next读取下一行。
  • 第二行和第三行是作为参数给出的第二个文件执行的,这里是File1
    • 条件NF == 0适用于空行并打印repl的下一个可用替换行,然后从File1
    • 读取下一行
    • 来自1的非空行File1 已经 ,这是打印该行的快捷方式。

答案 1 :(得分:2)

这是一个使用awk和getline

$ awk 'NF==0{ getline < "file2" }1' file1
1
2
3
4
5
6
7
8

9

额外空行是file1中存在更多空位的测试,因为file2中有值。

答案 2 :(得分:1)

任何情况下都很容易 Perl one-lnier

如果您将file_2更改为没有换行符的文件,那么这是一项轻松的工作。

enter image description here

db.web_tech.createIndex({"applications.name":1}, {"background": true})

如何运作

主要部分在这里:
$ cat file_1 1 2 3 5 6 9 $ cat file_2 3 7 8 $ $ perl -ale '@file2=@F if $.==1; print ( /\d+/ ? @F : shift @file2 ) if $.!= 1' file_2 file_1 1 2 3 3 5 6 7 8 9
如果该行与任何数字不匹配,它会弹出 file2 。就是这样 您也可以将 @F 更改为 $ _
print ( /\d+/ ? @F : shift @file2 )

答案 3 :(得分:0)

为什么不填充数组然后打印出提供的索引:

awk 'NF{a[$1]}END{for( i in a )print i}' file1 file2