在某个字母/符号后,将文件2中的行插入文件1

时间:2018-03-12 06:37:34

标签: linux bash awk sed csh

我正在尝试使用awk / sed / forloop / foreach组合特定位置的两个文件...以最简单的方式。

首先,我的文件1有...

#   
#   
>  
#    
#     
>

等。

在我的第二个文件中,我只有数字(与其他文件中的>一样多的数字)。

Num1  
Num2   
Num3
等等......

我希望在每个>之后按顺序在文件2中插入数字。在第一个文件中,例如......

#   
#   
> Num1  
#    
#     
> Num2

谢谢!

4 个答案:

答案 0 :(得分:1)

awk 解决方案:

awk '/^>/{ r=$0; if ((getline < "file2") > 0) $0=r OFS $0 }1' file1

示例输出:

#
#
> Num1
#
#
> Num2

答案 1 :(得分:0)

让我们考虑一下我们需要与您的条件合并的file1file2

$ more file1 file2
::::::::::::::
file1
::::::::::::::
#
#
>
#
#
>
#
#
>
::::::::::::::
file2
::::::::::::::
98
58
348

然后您可以使用以下awk命令:

$ awk '/^#/{print $0; next}/^>/{printf "> "; getline < "file2" ; print $0}' file1

<强>输出:

#
#
> 98
#
#
> 58
#
#
> 348

说明:

    对于以/^#/{print $0; next}开头的行,
  • #只需打印并转到下一行
  • /^>/{printf ">"; getline < "file2" ; print $0}当一行以>开头时,您打印>后跟getline语句file2提取的数字。

最后但并非最不重要的是,只需将命令的输出重定向到文件,以便通过重定向运算符>保存结果:

$ awk '/^#/{print $0; next}/^>/{printf "> "; getline < "file2" ; print $0}' file1 > result

遵循Sundeep建议,您甚至可以使用更紧凑的命令:

awk '/^>/ && (getline num < "file2")==1{$0 = $0 OFS num} 1'

对于以>开头的行,您调用getline语句从file2获取下一行,并将内容存储到num变量getline如果成功,将返回1,这将触发scoper {$0 = $0 OFS num},在其中您自行替换行内容,然后是您连接的output field separator(默认为空格)存储在num变量中的值。最后但并非最不重要的是,1命令末尾的awk用于触发$0中包含的整个修改行的默认打印。

答案 2 :(得分:0)

<h1>Page header</h1>
<article>
<h2>This is my article</h2>
<p>The content of my page would go here</p>
</article>

<footer>
<nav class="pagination">
Page: 

<a onclick="funPage(1)" href="#">1</a>
<a onclick="funPage(2)" href="#">2</a>
<a onclick="funPage(3)" href="#">3</a>
<a onclick="funPage(4)" href="#">4</a>
<a onclick="funPage(5)" href="#">5</a>

</nav>
</footer>

sed命令sed -r "/^>/R file2" file1 | sed -r "/>/d;s/^([^#])(.*)/> \1\2/" 从file2读取一行,总是在触发时。但它会产生一些中间输出,需要进行调整(由管道后面的sed完成) - 这是以前的中间结果:

R file2

第二个sed调用只是标准和sed vodoo:

#   
#   
>  
Num1
#    
#     
>
Num2

删除只是“&gt;”的行并替换行,而不是以前面带有“&gt;”的#开头。 (\ 1 = N,\ 2 = umX)

sed -r "/>/d;s/^([^#])(.*)/> \1\2/"

这是另一种方式,几乎相同:

#   
#   
> Num1
#    
#     
> Num2

第二个sed命令,第2部分只匹配不以#开头的行(并且只包括#),用前面的“&gt;”替换它们。

第三种方法是用修改后的版本替换文件2,该版本已在每行前面包含“&gt;”。

答案 3 :(得分:0)

不需要getline:

awk 'NR==FNR{a[NR]=$0; next} {print $0 (/>/ ? " " a[++c] :"")}' file2 file1