簡體   English   中英

如何使用cut和awk命令提取表格格式的文本輸入?

[英]How to use cut and awk commands to extract text input in a tabular format?

我有以下文件input.txt:

文件名: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種類型可以在輸入文件中以任何順序排列,我需要從文件中查找所有bug /功能/ io_changes,並逐列列出它們。

在此處輸入圖片說明

這個怎么樣。 我們將值存儲在每個文件的數組中。 在這里,我將出現在多行上的條目連接起來。

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. dump()函數將記錄寫出到文件中。
  2. BEGIN將“:”分配給字段分隔符(因此在此解決方案中,字段中的文本不允許使用“:”)。 輸出由制表符分隔。
  3. 然后在每個文件的開頭(FNR = 1),如果有記錄,我們將轉儲記錄,然后重置或回收。
  4. 然后,如果一行中有一個“:”(這將導致NF> 1),我們將跟蹤所設置的值並將其存儲在數組中。 如果沒有“:”(使NF == 1),那么我們將添加到最后添加的值。
  5. 最后,在最后一個文件的末尾,我們最后一次轉儲了內容。

如果找到詞組,則設置變量,如果找到其他詞組之一,則將其取消設置,然后根據文件名將行保存到數組。
刪除:之前的所有內容
然后在列中打印行

#!/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

不幸的是,這不會為每個文件打印多行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM