gpt4 book ai didi

awk 选择带有变量的行,无法打开没有这样的文件

转载 作者:行者123 更新时间:2023-12-04 08:56:47 24 4
gpt4 key购买 nike

我正在努力使用基本的 awk 命令。

文件 1:

AB253828.1
AB253829.1
AB253830.1
AB253831.1

文件 2:

accession   accession.version   taxid   gi
A00001 A00001.1 10641 58418
A00002 A00002.1 9913 2
A00003 A00003.1 9913 3
A00004 A00004.1 32630 57971
A00005 A00005.1 32630 57972
A00006 A00006.1 32630 57973
A00008 A00008.1 32630 57974
A00009 A00009.1 32630 57975
A00010 A00010.1 32630 57976

两个文件都有 >1 000 000 行

如果第 2 列对应于文件 1 的模式,我想打印文件 2 的第 2 列和第 3 列我尝试了很多可能性,但都没有用...

for ACC in $(cat file1.txt)
do
#ACC1=$(echo "\"$ACC\"")
awk -v OFS='\t'-v z="$ACC" '{ if($2 == z) { print $2,$3 } }' file2.txt
done

我得到了

awk: cannot open { if($2 == z) { print $2,$3 } } file2.txt (No such file or directory)

我检查过,file2 在那里。我想,我的问题是变量 z 但我找不到解决方案。

最佳答案

直接的问题是您在第二个 -v 选项之前缺少一个空格。 (仔细观察:您将 OFS 设置为 \t-v 然后 Awk 认为 z="$ACC" 是您实际的 Awk 脚本,并寻找 - 并提示缺少 - 一个名为 ... 您的 Awk 脚本内容的文件。)但实际上,您想更彻底地检查它。

awk -v OFS='\t' 'NR==FNR { z[$1]++; next }
$2 in z { print $2,$3 }' file1.txt file2.txt

这使用常见的 Awk 习惯用法将第一个文件读入内存,然后打印出第二个文件的记录,第二个文件的第二个字段作为第一个文件中的条目存在。这应该快几个数量级,当然也可以简单地修复 reading lines with for反模式。

如果第一个文件太大而不能一次放入内存,可以将它分成更小的部分(比如每部分 500,000 行?)并分别在每个部分上运行。很容易看出 Awk 何时消耗过多内存以致于您的系统开始抖动;至少在前几次运行期间,请留意 top 或一些类似的监控工具,如果出现异常则终止进程。

关于awk 选择带有变量的行,无法打开没有这样的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63779016/

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