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