将 awk 与两个文件一起用作过滤器
Use awk with two files as a filter
我想知道这是否可行:
我有两个文件:
文件一个:
100005282 C
100016196 G
100011755 C
100012890 G
100016339 C
100013563 C
100015603 G
100008436 G
100004906 C
和文件 b:
rs10904494 100004906 A C
rs11591988 100005282 C T
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
rs9419478 100015603 G C
rs11253562 100016196 G T
rs4881551 100016339 C A
根据文件a中$1中的数字和文件b中的$2中的数字,比较[=27=中$2中的字母]file a 与 file b 中的相同数字,最后结果必须是这样的:
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
只显示不匹配的结果。
可以用 awk 做到这一点吗?
如果您在使用 awk 时遇到问题,也许使用 grep 会更简单,例如
cat file1.txt
100005282 C
100016196 G
100011755 C
100012890 G
100016339 C
100013563 C
100015603 G
100008436 G
100004906 C
cat file2.txt
rs10904494 100004906 A C
rs11591988 100005282 C T
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
rs9419478 100015603 G C
rs11253562 100016196 G T
rs4881551 100016339 C A
grep -vFwf file1.txt file2.txt
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
否则,这应该适用于您的用例:
awk -F'\t' 'NR==FNR {A[,]; next} !(,) in A' file1.txt file2.txt
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
这似乎是您正在寻找的逻辑
$ awk 'NR==FNR{a[]=; next} a[]!=' file1 file2
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
将 file1 $1 与 file2 $2 匹配并在 file1 $2 != file2 $3 时打印
我想知道这是否可行:
我有两个文件:
文件一个:
100005282 C
100016196 G
100011755 C
100012890 G
100016339 C
100013563 C
100015603 G
100008436 G
100004906 C
和文件 b:
rs10904494 100004906 A C
rs11591988 100005282 C T
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
rs9419478 100015603 G C
rs11253562 100016196 G T
rs4881551 100016339 C A
根据文件a中$1中的数字和文件b中的$2中的数字,比较[=27=中$2中的字母]file a 与 file b 中的相同数字,最后结果必须是这样的:
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
只显示不匹配的结果。
可以用 awk 做到这一点吗?
如果您在使用 awk 时遇到问题,也许使用 grep 会更简单,例如
cat file1.txt
100005282 C
100016196 G
100011755 C
100012890 G
100016339 C
100013563 C
100015603 G
100008436 G
100004906 C
cat file2.txt
rs10904494 100004906 A C
rs11591988 100005282 C T
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
rs9419478 100015603 G C
rs11253562 100016196 G T
rs4881551 100016339 C A
grep -vFwf file1.txt file2.txt
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
否则,这应该适用于您的用例:
awk -F'\t' 'NR==FNR {A[,]; next} !(,) in A' file1.txt file2.txt
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
这似乎是您正在寻找的逻辑
$ awk 'NR==FNR{a[]=; next} a[]!=' file1 file2
rs10904494 100004906 A C
rs10904561 100008436 T G
rs7906287 100011755 A G
rs9419557 100012890 A G
rs9286070 100013563 T C
将 file1 $1 与 file2 $2 匹配并在 file1 $2 != file2 $3 时打印