[英]Using grep output as pattern for another grep
我有三個文件a , b和c 。 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 應該輸出 ,例如對於codeb
( c中的第一行):
This is ca:
testb
This is ca_complete:
testb21345
但它輸出(每行):
This is ca:
testb
This is ca_complete:
#(Empty line)
因此,第一個grep
正在找到正確的test
並將其存儲在變量ca
而第二個grep
在a中找不到此模式。
與使用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.