linux - 从文件中 Grep 文本并打印以上以模式开头的行

标签 linux perl text

文本文件-1

SAR001
SAR005
SAR008
SAR010
SAR012
.
.
.

文本文件-2

C 0001 Carbon [C]
D SAR001 methane [CH3]
D SAR002 ethane
D SAR003 propane
D SAR004 butane
D SAR005 pentane
C 0002 Hydrogen [H]
D SAR006 hydronium
D SAR007 water [H20]
C 0003 Nitrogen [N]
D SAR008 ammonia [NH3]
D SAR009 ammonium chloride [NH4Cl]
D SAR010 amide
C 0004 Oxygen [O]
D SAR011 ozone
D SAR012 super oxide
.
.
.

期望的输出

SAR001 Carbon [C]
SAR005 Carbon [C]
SAR008 Nitrogen [N]
SAR010 Nitrogen [N]
SAR012 Oxygen [O]
.
.
.

我的查询是从textfile-1到textfile-2中grep文本,然后打印上一行以“C”开头的第三列。欢迎任何基于 shell 或 perl 的脚本。我正在使用 OpenSUSE linux。

问候。

最佳答案

你可以试试

perl -anE '
  BEGIN{ open($f,pop)||die$! }
  if ($F[2]) { $c = $F[2]; next }
  $s{ $F[1] } = $c;
  END{
    s|\s+$||, s|$| $s{$_}|, say while <$f>;
  }
' textfile-2 textfile-1

输出

SAR001 Carbon
SAR005 Carbon
SAR008 Nitrogen
SAR010 Nitrogen
SAR012 Oxygen
<小时/>
perl -ne '
  BEGIN{ open($f,pop)||die$! }
  @F = split /\s+/, $_, 3;
  if (!/SAR/) { $c = $F[2]; next }
  $s{ $F[1] } = $c;
  END{
    s|\s+$||, s|$| $s{$_}|, print while <$f>;
  }
' textfile-2 textfile-1

输出

SAR001 Carbon [C]
SAR005 Carbon [C]
SAR008 Nitrogen [N]
SAR010 Nitrogen [N]
SAR012 Oxygen [O]

关于linux - 从文件中 Grep 文本并打印以上以模式开头的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19050486/

相关文章:

perl - 从后到上读取日志文件 - perl

linux - 如何使 Debian 软件包安装依赖项?

linux - 使用脚本更改用户的主要和次要组

perl - 使用 Dumper 不会触发故障

regex - 如何使用正则表达式/终端工具删除 csv 单元格内的换行符?

opengl - 在OpenGL中绘制字符串

text - Flutter-如何在黑暗模式下更改状态栏文本的颜色?

c - 为什么使用 timer_settime() 会影响 sleep() 函数

linux - Caffe编译失败: make: *** [. build_release/src/caffe/data_transformer.o] 错误1

ios - 在 iOS 应用程序中检索文本文件