awk if else 有条件

Awk if else with conditions

我正在尝试制作一个脚本(和一个循环)来提取匹配的行以将它们打印到一个新文件中。有两个条件:第一个是如果地图文件的第二列与测试文件的第四列匹配,我需要打印地图文件的第二列和第四列的值。第二个条件是当没有匹配时,我想打印测试文件第二列的值和第二列的零。

我的测试文件是这样制作的:

8   8:190568    0   190568  
8   8:194947    0   194947  
8   8:197042    0   197042  
8   8:212894    0   212894  

我的地图文件是这样制作的:

8   190568  0.431475    0.009489
8   194947  0.434984    0.009707
8   19056880    0.395066    112.871160
8   101908687   0.643861    112.872348

第一次尝试:

for chr in {21..22}; 
do
awk 'NR==FNR{a[]; next} {if ( in a) print ,  in a; else print ,  == "0"}' map_chr$chr.txt test_chr$chr.bim > position.$chr;
done

结果:

8:190568 1
8:194947 1
8:197042 0
8:212894 0

我的第二个脚本是:

for chr in {21..22}; do
    awk 'NR == FNR { ++a[]; next }
       in a { print a[], ; ++found[] }
      END { for(k in a) if (!found[k]) print a[k], 0 }' \
         "test_chr$chr.bim"  "map_chr$chr.txt" >> "position.$chr"
done

结果是:

1 0
1 0
1 0
1 0

我需要的结果是:

8:190568 0.009489
8:194947 0.009707
8:197042 0
8:212894 0

这个 awk 应该适合你:

awk 'FNR==NR {map[]=; next} {print , map[]+0}' mapfile testfile

190568 0.009489
194947 0.009707
197042 0
212894 0

此 awk 命令首先处理 mapfile,然后将 </code> 作为键存储,将 <code> 作为值存储在名为 map 的关联数组中。 稍后当它在第二个块中处理 testfile 时,我们使用键作为 </code> 从第二个文件打印 <code> 并将存储的值存储在 map 中。我们在存储值中添加 0 以确保在 map.

中不存在 </code> 时我们得到 <code>0