Bash 使用grep输出作为另一个grep的模式

Bash 使用grep输出作为另一个grep的模式,bash,grep,Bash,Grep,我有三个文件,a、b和cc有一个代码列表b有两列:一列代码及其对应的testname。最后一个文件a有一个名称列表,其中包含(作为子字符串)所有测试名称。示例: c: codeb coded codea codec codee codef codee codeg codeh codea testa codeb testb codec testc coded testa codee testa codef testb codeg testc codeh testa

我有三个文件,abcc有一个代码列表b有两列:一列代码及其对应的
test
name。最后一个文件a有一个名称列表,其中包含(作为子字符串)所有测试名称。示例:

c

codeb
coded
codea
codec
codee
codef
codee
codeg
codeh
codea   testa
codeb   testb
codec   testc
coded   testa
codee   testa
codef   testb
codeg   testc
codeh   testa
testa1234
testb21345
14231testcAr
        This is ca:
        testb
        This is ca_complete:
        testb21345
b

codeb
coded
codea
codec
codee
codef
codee
codeg
codeh
codea   testa
codeb   testb
codec   testc
coded   testa
codee   testa
codef   testb
codeg   testc
codeh   testa
testa1234
testb21345
14231testcAr
        This is ca:
        testb
        This is ca_complete:
        testb21345
a

codeb
coded
codea
codec
codee
codef
codee
codeg
codeh
codea   testa
codeb   testb
codec   testc
coded   testa
codee   testa
codef   testb
codeg   testc
codeh   testa
testa1234
testb21345
14231testcAr
        This is ca:
        testb
        This is ca_complete:
        testb21345
我想在a文件中为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
但它输出(每行):


因此,第一个
grep
是找到正确的
test
并将其存储在变量
ca
中,但第二个是在a

中找不到这种模式,而不是使用bash和grep,使用单个awk调用来生成所需的输出会更简单,也可能更快。例如,使用GNU awk For thr
argid
变量,您可以编写:

$ 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"
或者分成单独的步骤

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"

当设置
ca_complete
时,你又从
c
变灰了,难道你不想从
a
中得到它吗?@EricRenouf正确,打字错误。@anubhava Ahm,对…?你的文件
b
结尾可能有回车吗?@EricRenouf我已经用nano创建了所有的文件,我如何检查我是否有回车?