在Bash中,grep为一行并在文件中打印该行但有更多信息

时间:2016-05-04 17:09:49

标签: bash grep echo

在bash中,我使用grep命令将结果打印到文件中:

  grep "4 CA   1" CVOLOPTs*SYMREMO.out | grep "11 O    0 0 0" >> data.dat

data.dat文件中打印以下内容:

 4 CA   1     2.3311     4.4052   11 O    0 0 0

我想让data.dat看起来如下:

 252   4 CA   1     2.3311     4.4052   11 O    0 0 0

我尝试过类似的事情:

grep "4 CA   1" CVOLOPTs*SYMREMO.out | grep "11 O    0 0 0" >> echo "252" data.dat

但是不起作用。

如果你能帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

使用awk的额外管道可以解决这个问题:

grep "4 CA   1" CVOLOPTs*SYMREMO.out | grep "11 O    0 0 0" | awk ´{print "252",$0}´ >> data.dat

整个事情可以通过一个awk完成:

awk ´/4 CA   1/ && /11 O    0 0 0/ {print "252",$0}' CVOLOPTs*SYMREMO.out >> data.dat

$0是整个当前行。在这种情况下,由2个正则表达式选择的行。

awk逐个读取每一行。

正则表达式代表正则表达式。使用awk时,它们会被/括起来:例如/4 CA 1/

/4 CA 1/ && /11 O 0 0 0/是一个表达式:当读取的行与第一个正则表达式and&&)匹配第二个正则表达式时,它是正确的。在这种情况下,只有字符串;请参阅Open Group Base Specifications Issue 6中的 9. Regular Expressions

答案 1 :(得分:1)

您可能不需要使用grep,因为您可以获得所需的输出 这个awk单行:

awk '/4 CA   1/ && /11 O    0 0 0/{printf "252\t%s\n",$0}' CVOLOPTs*SYMREMO.out >> data.dat

我在252之后放了一个标签,可能会改成一个或多个空格