0

我正在阅读这个问题 Awk code to select multiple patterns

用户将此作为输入

------------------------------------------------------------------------
r4544 | n479826 | 2012-08-28 07:12:33 -0400 (Tue, 28 Aug 2012) | 1 line
Changed paths:
   M /branches/8.6.0/conf/src/main/config/RTSConfig.xml

CET-402: some text comment
------------------------------------------------------------------------
r4550 | n479826 | 2012-09-04 05:51:29 -0400 (Tue, 04 Sep 2012) | 1 line
Changed paths:
   M /branches/8.6.0/conf/src/main/config/RTSConfig.xml
   M /branches/8.6.0/conf/src/main/config/base.cfg
   M /branches/8.6.0/conf/src/main/config/prod.cfg
   M /branches/8.6.0/conf/src/main/config/qa.cfg
   M /branches/8.6.0/conf/src/main/config/uat.cfg

CET-438: some text comment

他想要这个作为输出

r4544 | n479826 | 2012-08-28 07:12:33 | /branches/8.6.0/conf/src/main/config/RTSConfig.xml
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/RTSConfig.xml
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/base.cfg
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/prod.cfg
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/qa.cfg
r4550 | n479826 | 2012-09-04 05:51:29 | /branches/8.6.0/conf/src/main/config/uat.cfg

正确答案是这样

awk -F"|" '/^r/{a=$1;b=$2;c=substr($3,0,20)}/^   M/{gsub(/   M /," ");print a"|"b"|"c"|"$0}' your_file

我没有完全理解。

现在我得到了这部分

/^r/{a=$1;b=$2;c=substr($3,0,20)}/^

但我没有得到第二部分 M/{gsub(/ M /," ");print a"|"b"|"c"|"$0}

我的问题是

  1. 开头是什么M意思 2.Now awk 将逐行读取文件,因此它意味着在第二行,即 Chngaed 路径的值,因为该行上a =0没有字段分隔符|
  2. 现在,当 awk 再次进入第三行时a,b,c =0$0 = /bracnhes结果如何仍然显示 a,b,c 的旧值

在多行上使用 awk 时我感到困惑

4

3 回答 3

1

像这样做

/^r/{a=$1;b=$2;c=substr($3,0,20)}

  1. r它匹配唯一以和一些数字开头的行。所以它得到 a,b,c 变量

/^ M/{gsub(/ M /," ");print a"|"b"|"c"|"$0}

  1. 这匹配与spaces and M获得另一部分的线。在此匹配过程中,a,b,c 将从先前保存的值中获取
于 2013-01-16T06:51:40.480 回答
1

我懒得解释答案:) 但是让我暂时搁置我的懒惰一段时间:

/^r/{a=$1;b=$2;c=substr($3,0,20)}

只有当行以字母 r 开头时,上面的代码块才会执行。块内部说将第一个字段存储在 a 中,第二个字段存储在 b 中,输入的第三个字段是:

2012-08-28 07:12:33 -0400 (Tue, 28 Aug 2012)

但我只需要带有时间戳的日期,其余的对我来说已经过时了。它始终是 20 个字符。所以我从第三个字段中取出一个子字符串并将其存储在 c 中。

我的主要兴趣是以 /^ M/ 开头的行,我必须显示上一行中以 r 开头的信息,并且确保在我们想要的行之前有一行以 r 开头,其中包含所有信息我必须在前面加上以 M 开头的行。

因此,每次以 M 开头的行都会添加存储在 ab 和 c 中的值。

M/{gsub(/ M /," ");print a"|"b"|"c"|"$0}

gsub 部分将从当前行中删除带有空格的“ M ”部分。print 部分只是在当前行前面加上 ab 和 c 的值 | 作为分隔符。

这是什么逻辑!

我现在会回到我的懒惰模式:)

于 2013-01-16T07:11:16.200 回答
0

原因是在遇到 M 之前没有替换 a、b 和 c 的值。所以它仍然附加到打印语句中。

于 2013-01-16T10:11:32.570 回答