首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个分隔符的切片字符串

具有多个分隔符的切片字符串
EN

Stack Overflow用户
提问于 2016-11-28 13:48:51
回答 3查看 622关注 0票数 0

我有许多包含目标行的日志文件,我希望'grep',例如:

代码语言:javascript
复制
EGPA019_90pc.recode.2.log:Cross-Entropy (masked data):   0.556984

我希望将间隔为制表符的"2“和"0.556984”切成一个文件

所以,如果我输入:

代码语言:javascript
复制
grep "Cross-Entropy (masked data):" *.log | cut -d '.' -f 3 >> targetFile.txt

我得到了"2",然后:

代码语言:javascript
复制
grep "Cross-Entropy (masked data):" *.log | cut -d ' ' -f 4 >> targetFile.txt

我得到了"0.556984“。但是,我如何在一行代码中获得目标文件中同一行上的"2“,然后是制表符,然后是"0.556984”?

非常感谢

克莱夫

EN

回答 3

Stack Overflow用户

发布于 2016-11-28 14:15:03

你可以使用grep和一些bash内置的regEx特性。

代码语言:javascript
复制
grep -h "Cross-Entropy (masked data):" *.log | while IFS= read -r string; do
       [[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]] 
       printf "%s\t%s\n" "${BASH_REMATCH[1]}"  "${BASH_REMATCH[2]//[[:blank:]]}";
done

我的输入文件

代码语言:javascript
复制
$ cat *.log
EGPA019_90pc.recode.2.log:Cross-Entropy (masked data):   0.556984
EGPA019_90pc.recode.9.log:Cross-Entropy (masked data):   0.996984
EGPA019_90pc.recode.7.log:Cross-Entropy (masked data):   0.756984

$ grep -h "Cross-Entropy (masked data):" *.log | while IFS= read -r string; do
       [[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]] 
       printf "%s\t%s\n" "${BASH_REMATCH[1]}"  "${BASH_REMATCH[2]//[[:blank:]]}"; done
2       0.556984
9       0.996984
7       0.756984

解释:-

  1. 正在使用内置的bash regEx功能来捕获所需的字符串,而不是使用其他本机工具。
  2. grep的输出通过管道来应用regEx [ "$string" =~ recode.([[:digit:]]+).*:\ (.*)$ ]],它捕获您所需的条目、数字和小数number.
  3. Using printf以打印这些变量。第二个捕获,即十进制数字的开头有空格字符,通过"${BASH_REMATCH[2]//[[:blank:]]}"

将其删除

您还可以将其封装在shell脚本中,如下所示:

代码语言:javascript
复制
#!/bin/bash

while IFS= read -r string; do
    [[ "$string" =~ .recode.([[:digit:]]+).*:\ (.*)$ ]]
    printf "%s\t%s\n" "${BASH_REMATCH[1]}"  "${BASH_REMATCH[2]//[[:blank:]]}"
done < <(grep -h "Cross-Entropy (masked data):" *.log)

或者)使用带有PCRE标志-P选项的grepxargs来过滤输出。

代码语言:javascript
复制
grep -Pho '\.recode\.\K\d+|: \K.*' *.log | xargs -n2 -d'\n'
2   0.556984
9   0.996984
7   0.756984

(或者)使用简单得多的perl regEx语法。

代码语言:javascript
复制
perl -lne 'print "$1 $2" if /\.recode\.(\d+).*:\s+(.*)/' *.log
2 0.556984
9 0.996984
7 0.756984
票数 2
EN

Stack Overflow用户

发布于 2016-11-28 16:54:21

我想我应该使用awk而不是解析grep的输出。

我没有您的数据集来测试它,但在我看来,以下方法应该可以工作。

代码语言:javascript
复制
awk '/^Cross-Entropy \(masked data\):/ {split(FILENAME,a,".");printf("%s\t%s\n", a[3], $NF}' *.log

作为一行代码,它有点长。作为独立脚本,它可能如下所示:

代码语言:javascript
复制
#!/usr/bin/awk -f

/^Cross-Entropy \(masked data\):/ {
  split(FILENAME,a,".")
  printf("%s\t%s\n", a[3], $NF
}

将其保存在一个文件中,使其成为可执行文件,您就拥有了一个全新的shell命令。

请注意,这是通过使用字段拆分来实现的,而不是使用正则表达式。

票数 0
EN

Stack Overflow用户

发布于 2016-11-29 06:01:50

您可以使用sed删除不需要的内容

代码语言:javascript
复制
grep "Cross-Entropy (masked data):" *.log | sed 's/.*recode.//;s/\..*: //' 

grepsed可以组合使用:

代码语言:javascript
复制
sed -n '/Cross-Entropy (masked data):/ {s/.*recode.//;s/\..*: //;p}' *.log
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40837885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档