簡體   English   中英

使用grep輸出作為另一個grep的模式

[英]Using grep output as pattern for another grep

我有三個文件abc c有一個代碼列表。 b有兩列:一列代碼及其相應的test名稱。 最后一個文件a包含一個名稱列表, 其中包含 (作為子字符串)所有測試名稱。 例子:

c

 codeb coded codea codec codee codef codee codeg codeh 

b

 codea testa codeb testb codec testc coded testa codee testa codef testb codeg testc codeh testa 

 testa1234 testb21345 14231testcAr 

我想輸出在C每個代碼文件對應的名稱。 例如, codeb應該輸出testb21345 我一直無法使其工作。 我認為這與grep無法理解模式有關。 這是我寫為MVE的循環:

diractual=$PWD

while read line; do

        ca=$(grep $line $diractual/b | cut -f 2)  
        ca_complete=$(grep $ca $diractual/a)
        echo "This is ca:"
        echo "$ca"
        echo "This is ca_complete:"
        echo "$ca_complete"
done <$diractual/c

兩個echo s 應該輸出 ,例如對於codebc中的第一行):

        This is ca:
        testb
        This is ca_complete:
        testb21345

但它輸出(每行):

        This is ca:
        testb
        This is ca_complete:

        #(Empty line)

因此,第一個grep正在找到正確的test並將其存儲在變量ca而第二個grepa中找不到此模式。

與使用bash和grep相比,使用單個awk調用來生成所需的輸出會更簡單,並且可能更快。 例如,使用GNU awk作為thr ARGIND變量,您可以編寫:

$ gawk 'ARGIND==1{a[$1]=$2}ARGIND==2{b[$1]}ARGIND==3{for(i in b) if ($0 ~ a[i]) print i, $0}' b c a
codeh testa1234
codea testa1234
coded testa1234
codee testa1234
codef testb21345
codeb testb21345
codeg 14231testcAr
codec 14231testcAr

以更具可讀性的格式為:

gawk ' ARGIND == 1 { a[$1] = $2 } 
       ARGIND == 2 { b[$1] }
       ARGIND == 3 {
           for (i in b) 
               if ($0 ~ a[i])
                   print i, $0
       }' b c a

如果我理解正確

filea="a"
fileb="b"
filec="c"
while read -r code
do
        printf "%s: %s\n" "$code" "$(grep "$(grep -oP "^$code\s+\K.*" "$fileb")" "$filea")"
done < "$filec"

版畫

codeb: testb21345
coded: testa1234
codea: testa1234
codec: 14231testcAr
codee: testa1234
codef: testb21345
codee: testa1234
codeg: 14231testcAr
codeh: testa1234

或分為單獨的步驟

while read -r code
do
        tst=$(grep -oP "^$code\s+\K.*" "$fileb")
        res=$(grep "$tst" "$filea")
        printf "%s\t%s\t%s\n" "$code" "$tst"  "$res"
done < "$filec"

版畫

codeb   testb   testb21345
coded   testa   testa1234
codea   testa   testa1234
codec   testc   14231testcAr
codee   testa   testa1234
codef   testb   testb21345
codee   testa   testa1234
codeg   testc   14231testcAr
codeh   testa   testa1234

暫無
暫無

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

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