评估列值是否在其他两列的范围内,并使用awk打印

评估列值是否在其他两列的范围内,并使用awk打印,awk,Awk,我有两个文件 文件1(简称): 文件2(简称): 我想创建一个新文件,其中: 如果文件1中的列1与文件2的列4匹配 文件1的第4列在文件2的第5列和第6列的范围内 打印文件2的第3列和文件1的第2列 例如: 对于文件1的第一行,第1列(1)与文件2的第4列(也是第1列)匹配,文件1的第4列(12500)大于等于11869且不是awk,而是与sqlite无关: #!/bin/bash # convert spaces to tabs tr -s ' \t' '\t' <file1.ra

我有两个文件

文件1(简称):

文件2(简称):

我想创建一个新文件,其中:

  • 如果文件1中的列1与文件2的列4匹配
  • 文件1的第4列在文件2的第5列和第6列的范围内
打印文件2的第3列和文件1的第2列

例如:


对于文件1的第一行,第1列(1)与文件2的第4列(也是第1列)匹配,文件1的第4列(12500)大于等于11869且不是awk,而是与sqlite无关:

#!/bin/bash

# convert spaces to tabs
tr -s ' \t' '\t' <file1.raw >file1.tsv
tr -s ' \t' '\t' <file2.raw >file2.tsv

sqlite3 >output.tsv <<'EOD'
create table t1 (c1,c2,c3,c4 int,c5,c6);
create table t2 (c1,c2,c3,c4,c5 int,c6 int);
.mode tabs
.import file1.tsv t1
.import file2.tsv t2
select distinct t2.c3, t1.c2 from t1,t2
where t1.c1=t2.c4 and t1.c4 between t2.c5 and t2.c6;
EOD
#/bin/bash
#将空格转换为制表符
tr-s'\t'\t'文件1.tsv
tr-s'\t'\t'文件2.tsv

sqlite3>output.tsv不是awk,而是与sqlite无关:

#!/bin/bash

# convert spaces to tabs
tr -s ' \t' '\t' <file1.raw >file1.tsv
tr -s ' \t' '\t' <file2.raw >file2.tsv

sqlite3 >output.tsv <<'EOD'
create table t1 (c1,c2,c3,c4 int,c5,c6);
create table t2 (c1,c2,c3,c4,c5 int,c6 int);
.mode tabs
.import file1.tsv t1
.import file2.tsv t2
select distinct t2.c3, t1.c2 from t1,t2
where t1.c1=t2.c4 and t1.c4 between t2.c5 and t2.c6;
EOD
#/bin/bash
#将空格转换为制表符
tr-s'\t'\t'文件1.tsv
tr-s'\t'\t'文件2.tsv

sqlite3>output.tsv文件有多大?它们分类了吗?如果不能优化,您将看到O(m*n)运行时和潜在的大量内存使用。这类事情可以简单地实现为sql查询(sqlite可以读取csv文件)。我没有想到这一点。是的,不可行,文件很大。考虑将SQL立即作为第一个资源,但想知道是否有awk解决方案。我想使用awk,您必须将一个文件的全部保存在内存中,或者反复读取它。如果它不在内存中,可能会非常慢。SQL的速度可能足够快;否则,创建显式索引可能会加快速度。文件有多大?它们分类了吗?如果不能优化,您将看到O(m*n)运行时和潜在的大量内存使用。这类事情可以简单地实现为sql查询(sqlite可以读取csv文件)。我没有想到这一点。是的,不可行,文件很大。考虑将SQL立即作为第一个资源,但想知道是否有awk解决方案。我想使用awk,您必须将一个文件的全部保存在内存中,或者反复读取它。如果它不在内存中,可能会非常慢。SQL的速度可能足够快;否则,创建显式索引可能会加快速度。这不起作用。例如,输出的第一行是
DDX11L1:135982[b38]A,G
。135982不在11869和14409之间。它还将相同的
1:135982[b38]A,G
与另一个文件中具有完全不同坐标的其他行放在一起。就上下文而言,DDX11L1是一种跨越特定空间的基因,而另一种是仅在一个地方发生的突变。不能分配给多个基因。我更改了脚本以将数字列转换为整数,现在似乎可以工作。这不起作用。例如,输出的第一行是
DDX11L1:135982[b38]A,G
。135982不在11869和14409之间。它还将相同的
1:135982[b38]A,G
与另一个文件中具有完全不同坐标的其他行放在一起。就上下文而言,DDX11L1是一种跨越特定空间的基因,而另一种是仅在一个地方发生的突变。不能分配给多个基因。我更改了脚本,将数字列转换为整数,现在似乎可以工作了。
DDX11L1   1:134982[b38]A,G
#!/bin/bash

# convert spaces to tabs
tr -s ' \t' '\t' <file1.raw >file1.tsv
tr -s ' \t' '\t' <file2.raw >file2.tsv

sqlite3 >output.tsv <<'EOD'
create table t1 (c1,c2,c3,c4 int,c5,c6);
create table t2 (c1,c2,c3,c4,c5 int,c6 int);
.mode tabs
.import file1.tsv t1
.import file2.tsv t2
select distinct t2.c3, t1.c2 from t1,t2
where t1.c1=t2.c4 and t1.c4 between t2.c5 and t2.c6;
EOD