我正在嘗試列印具有匹配字串的行,但也想為其他行列印“NA”

我正在嘗試列印具有匹配字串的行,但也想為其他行列印“NA”

我有一個看起來像這樣的文件:

Volume1  
created=Monday  
blah blah  
foo foo  
lock mode=exclusive  
ops  
layer id=1  

Volume2  
created=Tuesday  
jibber jabber  
foo foo  
ops  
layer id=2  

Volume3  
created=Wednesday  
blaaah  
foooo  
lock mode=shared  
ops  
layer id=3

我想做的是 grep “鎖定模式”,如果有,則列印整行,否則我想列印“NA”。我似乎不知道如何列印不匹配行的內容。我確信 awk 或 sed 也可以做到這一點。

我一直在嘗試類似的程式碼:

grep -A6 Volume | grep "lock mode" <file>

對於本例,我希望輸出顯示以下內容:

lock mode=exclusive  
NA  
lock mode=shared

答案1

這很容易perl

perl -l -00 -ne 'print /lock mode.*/ ? $& : "NA"'
  • -l將輸出欄位分隔符號設定為換行符
  • -00:段落模式(記錄為段落)
  • -ne code:為每個輸入記錄運行代碼
  • 如果記錄lock mode後麵包含任意數量的非換行符,則列印相符的內容 ( $&) 或NA其他。

基本上與@iruvar 的 awk 解決方案, 但在perl

答案2

段落awk模式

awk -v RS= '{match($0, /lock mode=[^\n]+/); 
  print RSTART? substr($0, RSTART, RLENGTH): "NA"}' file

RS=導致每個段落被視為單一記錄。致電給匹配將 的座標填入lock mode=....預定義變數RSTART和中RLENGTH。如果RSTART非零,則列印RSTART和對應的子字串,否則列印RLENGTHNA

答案3

與GNUsed

sed -n '
    /Volume/!d
    :a
    n
    /lock mode/{
        p
        d
        }
    /^\s*$/!ba
    c\NA
    ' <file>

awk

awk '
    BEGIN{
        FS="\n"
        RS="\n\n"
    }
    /lock mode/{
        for(i=1;i<=NF;i++)
            if($i ~ /lock mode/)
                print $i
        next
    }
    {
        print "NA"
    }
    ' <file>

相關內容