【问题标题】:extract string conditionally from variable column sized text file从可变列大小的文本文件有条件地提取字符串
【发布时间】:2015-02-09 15:07:27
【问题描述】:

从每行列数可变(制表符分隔)的文本文件中,我想提取具有特定条件的值。 文本文件如下所示:

S1=dhs    Sb=skf    S3=ghw    QS=ghr</b>
S1=dhf    QS=thg    S3=eiq<b/>
QS=bhf    S3=ruq    Gq=qpq    GW=tut<b/>
Sb=ruw    QS=ooe    Gq=qfj    GW=uvd<b/>

我想要这样的结果:

QS=ghr<b/>
QS=thg<b/>
QS=bhf<b/>
QS=ooe

请原谅我的幼稚问题,但我是一名初学者,正在尝试学习一些用于文本操作的基本 bash 脚本技术。

提前致谢!

【问题讨论】:

  • 你的文件中有那些&lt;b/&gt;标签吗?它们是非法的 html,而且看起来也毫无意义。
  • 不,他使用&lt;b/&gt; 格式化代码。
  • 我是 html 文盲,不知道如何正确格式化我的帖子..抱歉。

标签: bash substring


【解决方案1】:

你可以使用 awk ,

awk '{for(i=1;i<=NF;i++){if($i~/^QS=/){print $i}}}' file

这个 awk 命令遍历每个字段并检查以 QS= 开头的列。如果找到,则打印相应的列。

通过 grep,

grep -oP '(^|\t)\KQS=\S*' file

-o 参数表示只匹配。所以它只打印匹配的字符。

-P 这将启用 Perl 正则表达式模式。

(^|\t) 匹配行首或制表符。

\K 丢弃之前匹配的制表符或行边界的开始。

QS= 现在它匹配 QS= 字符串。

\S* 匹配零个或多个非空格字符。

【讨论】:

  • 它就像一个魅力。请问我可以对每个功能如何使其工作进行一些解释吗?非常感谢!!
  • 漂亮!非常感谢阿维纳什!
  • 使用 GNU awk 你也可以做到awk -vRS="[[:space:]]+" '/^QS=/' file
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多