2014-06-20 19 views
0

我有文件input.txt中,如下:如何使用cut和awk命令以表格格式提取文本输入?

文件名:test1.v

BUG: bug 102 is fixed by some user 
IO_CHANGE: there is no io_change for this version 
FEATURE: no feature added 

文件名:test2.v

BUG: bug 103 is fixed by some user 
also bug 105 is fixed 
IO_CHANGE: there is no io_change for this version 
FEATURE: yes feature number 3 also feature 23 
and feature 34 is added 

文件名:test3.v

BUG: bug 104 is fixed by some user 
FEATURE: yes feature number 2 
IO_CHANGE: 

我的问题: - 有时候BUG/FEATURE/IO_CHANGE有一个很长的描述在2行中,或者有时IO_CHANGE中没有任何内容,因此它是空白的。输出文件应该包含所有错误的列表,然后是特征和io_changes。这3种类型可以在输入文件中以任何顺序排列,我需要从文件中找到所有缺陷/功能/ io_changes并列出它们列。

enter image description here

回答

1

这个怎么样。我们将值存储在每个文件的数组中。在这里我连接出现在多行上的条目。

awk 'function dump() {if (vc>0) 
     print fn, vals["BUG"], vals["FEATURE"], vals["IO_CHANGE"] 
    } 
    BEGIN {FS=":";OFS="\t";vc=0} 
    FNR==1 {dump();val=""; delete vals; fn=FILENAME; vc=0} 
    NF>1 {val=$1; vals[val]=vals[val] $2; vc++} 
    NF==1 {vals[val] = vals[val] " " $1} 
    END{dump()}' test*v 
  1. 转储()函数是什么出到文件中写入一个记录。
  2. BEGIN将“:”分配给字段分隔符(所以在此解决方案中允许将“:”作为字段中的文本)。输出由制表符分隔。
  3. 然后在每个文件(FNR = 1)开始时,如果我们有任何文件,则转储记录,然后重置或收集。然后,如果一行有一个“:”(这会导致NF> 1),我们会跟踪我们正在设置的值并将其存储在数组中。如果没有“:”(使NF == 1),那么我们只是添加到我们添加的最后一个值。
  4. 最后,在最后一个文件的末尾,我们最后一次转储内容。
+0

由于事实,你要打印'$ 2'和使用' :'as'FS'没有':'的行将被打印 –

+0

谢谢@Jidder。我在'NF == 1'条件下输入了一个类型。它现在可以正确折叠多行。 – MrFlick

0

如果找到短语,则设置变量,如果找到其他短语之一,则取消设置它,然后根据文件名将行保存到数组。
删除之前的一切:每行
然后打印在列线

#!/bin/bash 

awk  'BEGIN{printf("%-8s%-60s%-60s%-20s\n\n","FILE","|BUG","|IO","|FEATURE")} 
    /BUG/{a=1}/IO_CHANGE:/ || /FEATURE/{a=0} {if (a){Bug[FILENAME]=Bug[FILENAME]""$0" "}} 
    /IO_CHANGE:/{b=1}/BUG/ || /FEATURE/{b=0} {if (b){IO[FILENAME]=IO[FILENAME]$0" "}} 
    /FEATURE/{c=1}/IO_CHANGE:/ || /BUG/{c=0} {if (c){Feat[FILENAME]=Feat[FILENAME]$0" "}} 
    END{ 
      for (k in Bug){ 
        Bug[k] = substr(Bug[k],index(Bug[k],":")) 
        IO[k] = substr(IO[k],index(IO[k],":")) 
        Feat[k] = substr(Feat[k],index(Feat[k],":")) 
        printf("%-8s%-60s%-60s%-20s\n\n","|"k,"|"Bug[k],"|"IO[k],"|"Feat[k])}} 
' test*v 

不幸的是这不会打印多行的每个文件