Bash 使用grep输出作为另一个grep的模式
我有三个文件,a、b和cc有一个代码列表b有两列:一列代码及其对应的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
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 thrargid
变量,您可以编写:
$ 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创建了所有的文件,我如何检查我是否有回车?