gpt4 book ai didi

bash - zgrep 不会像 grep 那样停止脚本

转载 作者:行者123 更新时间:2023-12-04 19:14:28 25 4
gpt4 key购买 nike

我是 Bash 脚本的新手,我正在尝试让这个脚本逐行读取文件 a.txt.gz 并检查该行的第二个值是否也存在于 b.txt.gz 文件中

我不知道为什么 zgrep 不会结束脚本,在读取 a.txt.gz 后它卡在闪烁的指针上

这是代码(测试)

zcat /home/tdq/Bash/a.txt.gz | while read p0 p1
do
if zgrep -q -e "[A-Za-z0-9=;._|()\t]*${p1}[A-Za-z0-9=;._|()\t]*" /home/tdq/Bash/b.txt.gz; then
echo "FOUND"
fi

我运行 time ./test 的结果与我预期的一样,但脚本不会结束,这是输出
FOUND
FOUND
FOUND

我尝试使用 grep,而不是 FOUND,但它可以结束脚本。
zcat /home/tdq/Bash/a.txt.gz | while read p0 p1
do
if grep -q -e "[A-Za-z0-9=;._|()\t]*${p1}[A-Za-z0-9=;._|()\t]*" /home/tdq/Bash/b.txt.gz; then
echo "FOUND"
fi
done

我运行 time ./test 的结果
real    0m9.361s
user 0m6.660s
sys 0m2.196s
tdq@td:~/bash$

谁能帮帮我,非常感谢

a.txt.gz(制表符分开)
1   rs367896724
2 rs540431307
3 rs555500075
4 rs548419688

b.txt.gz(制表符分开)
1   10177   rs367896724 A   AC  100 PASS    AC=2130;AF=0.425319;AN=5008;NS=2504;DP=103152;EAS_AF=0.3363;AMR_AF=0.3602;AFR_AF=0.4909;EUR_AF=0.4056;SAS_AF=0.4949;AA=|||unknown(NO_COVERAGE);VT=INDEL GT  1|0 0|1 0|1
2 10177 rs540431307 A AC 100 PASS AC=2130;AF=0.425319;AN=5008;NS=2504;DP=103152;EAS_AF=0.3363;AMR_AF=0.3602;AFR_AF=0.4909;EUR_AF=0.4056;SAS_AF=0.4949;AA=|||unknown(NO_COVERAGE);VT=INDEL GT 1|0 0|1 0|1
3 10177 rs555500075 A AC 100 PASS AC=2130;AF=0.425319;AN=5008;NS=2504;DP=103152;EAS_AF=0.3363;AMR_AF=0.3602;AFR_AF=0.4909;EUR_AF=0.4056;SAS_AF=0.4949;AA=|||unknown(NO_COVERAGE);VT=INDEL GT 1|0 0|1 0|1
4 10177 rs548419688 A AC 100 PASS AC=2130;AF=0.425319;AN=5008;NS=2504;DP=103152;EAS_AF=0.3363;AMR_AF=0.3602;AFR_AF=0.4909;EUR_AF=0.4056;SAS_AF=0.4949;AA=|||unknown(NO_COVERAGE);VT=INDEL GT 1|0 0|1 0|1

基本上,我必须在 a.txt.gz 和 b.txt.gz 中检查 rsxxxxx 是否匹配

c.txt.gz
10084625    rs123
10026407 rs456

d.txt.gz(这是原始文件)
514786698   10084625    491891820   4   12951   0.986   562 421
5221808 495944 1573768 4 664 0.261062 59 2
539535670 10026407 556933170 3 \N \N \N \N

输出文件 (c.txt.gz + d.txt.gz = e.txt.gz)
514786698   10084625    491891820   4   12951   0.986   562 421
5221808 \N \N \N \N
539535670 10026407 556933170 3 \N \N \N \N

预期的输出文件 (c.txt.gz + d.txt.gz = e.txt.gz)
514786698   10084625    491891820   4   12951   0.986   562 421
539535670 10026407 556933170 3 \N \N \N \N

所以它在 d.txt.gz 中写下了不在 c.txt.gz 中的那一行(第二行 - 495944)

最佳答案

使用 awk 和进程替换:

$ awk 'NR==FNR{a[$2];next}($3 in a){print "FOUND"}' <(zcat a.txt.gz ) <(zcat b.txt.gz)
FOUND
FOUND
FOUND
FOUND

awk '
NR==FNR { # first file hash to a on second field
a[$2]
next } # next record
($3 in a){ # second file
print "FOUND" } # print FOUND when found (more informative?)
' <(zcat a.txt.gz ) <(zcat b.txt.gz) # uncompress and use process substitution

对于您编辑的数据和预期输出:
$ awk '
NR==FNR{ a[$1]; next } # hash the first file, use $1 field as key
($2 in a) # second file, if $2 field value is found in a,
# ($2 in a) evaluates to true
# which initiates implicit printing of the record
' <(zcat c.txt.gz ) <(zcat d.txt.gz)

514786698 10084625 491891820 4 12951 0.986 562 421
539535670 10026407 556933170 3 \N \N \N \N

关于bash - zgrep 不会像 grep 那样停止脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43617678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com