【问题标题】:How to parse through the file and retrieve certain words [closed]如何解析文件并检索某些单词[关闭]
【发布时间】:2018-12-27 19:47:43
【问题描述】:

一个文件有这样的文本:

 32 host1       dock0:network__cps-spr-adapter,network__cps-ocs-adapter
 33 host2       dock2:custom-work__ccep-sep-adapter
 34 host3       dock2:custom-work__gmsa-host,dock1:custom-work2
 35 host4       dock2:eodprvg__subsactivity

我想解析文件的每一行并想检索前缀为dock0/dock1/dock2的单词

在上面的文本中,我的预期输出是:

dock0:network__cps-spr-adapter
dock2:custom-work__ccep-sep-adapter
dock2:custom-work__gmsa-host
dock1:custom-work2
dock2:eodprvg__subsactivity

【问题讨论】:

标签: bash shell parsing awk sed


【解决方案1】:
awk '{ print $3; }' your-input-file | awk -F, '{
  for (i = 1; i <= NF; i++) {
    if ($i ~ /^dock[0-2]:/) print $i;
  }
}'

根据您的输入产生以下输出。

dock0:network__cps-spr-adapter
dock2:custom-work__ccep-sep-adapter
dock2:custom-work__gmsa-host
dock1:custom-work2
dock2:eodprvg__subsactivity

更新:

受@Cyrus 的建议启发的变体,它避免了管道并合并了来自@sri-k 的请求以匹配dock:

awk -F'[ ,]+' '{
  for (i = 3; i <= NF; i++) {
    if ($i ~ /^dock[0-2]?:/) print $i;
  }
}' your-input-file

【讨论】:

  • 不,因为如果您查看数据 $3 是逗号分隔的前缀单词列表,并且您的示例没有给出请求的输出。
  • @AustinFrance:效果很好。我刚刚意识到有一些行带有文本“dock:platform-xyz”,我该如何适应呢?上面的脚本对于以 dock0/dock1/doc2 开头的脚本非常有效。
  • 将 /^dock[0-2]:/ 更改为 /^dock:[0-2]?:/ 表示匹配编号 0 - 2 0 或 1 次。所以它会专门匹配dock:dock0:dock1:dock2:没有别的。
  • 感谢@AustinFrance,它确实奏效了。
  • @Cyrus 仍然没有生成所需的输出。它忽略了 dock1:custom-work2。使用 -F'[ ,]+' 可以改进我的示例以丢弃管道。
【解决方案2】:

只需使用 awk 获取第三个字段:

awk '{print $3}'

【讨论】:

    【解决方案3】:

    这可能对你有用(GNU sed):

    sed '/\n/!s/[^ ,]\+/\n&\n/g;/^dock[012]/P;D' file
    

    将行拆分为单个单词并仅打印以dock 开头的单词,后跟012

    【讨论】:

    • 感谢potong,我确实尝试过这个,我希望它会在控制台上打印输出,但它没有。没有看到任何输出。
    • @SriK,如果人们回复他们的问题stackoverflow.com/help/someone-answers,请查看此链接
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多