2017-02-12 83 views
0

我想从File2将文本粘贴到File1在任何情况下如何将文本插入空行?

文件1:

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 

但它只有在有只有每秒线空白的工作,以防万一。我想问,在更复杂的情况下是可能的?换句话说,是否有一个通用的解决方案?

作为例子:

文件1

1 
2 
3 

5 
6 


9 

文件2

4 
7 
8 

输出

1 
2 
3 
4 
5 
6 
7 
8 
9 
+2

使用GNU sed的sed脚本,工作正常,我在第二个例子中,注意不要让'File1'和'File2'后以单行换行结束。例如:小心点击“8”和“9”后的返回。 –

+0

通过“通用解决方案”,你的意思是1)取两个文件,2)组合,3)分类4)消除空白?你可以做'cat f1 f2 |排序| grep。# – dawg

回答

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中,并由于next声明而从File2中读取下一行。
  • 第二行和第三行针对作为参数给出的第二个文件执行,这里是File1
    • 条件NF == 0为空行真并打印从repl下一个可用的替代路线,然后读取来自File1
    • 1excuted用于非空行从File1下一行,这是一个快捷方式用于打印生产线。
+1

@EdMorton我更新了脚本,感谢您的建议。 –

1

容易无论如何Perl的一个lnier

如果您改变file_2成一个文件,而无需换行符这是一个轻而易举的事。

enter image description here


$ cat file_1 
1 
2 
3 

5 
6 


9 
$ cat file_2 
3 7 8 
$ 
$ perl -ale '@[email protected] if $.==1; print (/\d+/ ? @F : shift @file2) if $.!= 1' file_2 file_1 
1 
2 
3 
3 
5 
6 
7 
8 
9 

它是如何工作

主要部分是在这里:
print (/\d+/ ? @F : shift @file2)
使其弹出的文件2如果该行不匹配任何数字。这就对了。
您也可以改变@F$ _
print (/\d+/ ? $_ : shift @file2)

2

这里有一个用awk和getline

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

9 

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

+0

这可能是getline的一个很好的用法。 '!NF'会变短。 – karakfa

0

何不索性填数组,然后打印出所提供的指标:

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

,因为它不会以读取/期望的顺序打印值,它将以随机(散列)顺序打印这两个文件中的值。你可能只需要'awk'NF'file1 file2'。 –

+0

不......您的解决方案将按它们在文件中出现的顺序打印它们。矿将按数字顺序显示它们。 – grail

+0

不,不会,你可以在https://www.gnu.org/software/gawk/manual/gawk.html#Scanning-an-Array上阅读有关'in'的操作符:''数组被这个语句访问是由awk'中的数组元素的内部排列决定的。换句话说,它们被访问的顺序是它们被存储在散列表中的顺序,对于你可以考虑的所有意图是随机的。 –

相关问题