如何有条件地将一个文件中的列替换为另一个文件?

时间:2014-10-22 21:30:07

标签: unix awk sed

File1以:

开头
 1 1
 1 3
 2 4
 1 5
 1 6
 1 7
 1 10
 1 13
 1 15
 1 17

File2以:

开头
0 MET 1
0 GLN 2
0 VAL 3
0 ILE 4
0 LEU 5
0 LEU 6
0 ASP 7
0 LYS 8
0 VAL 9
0 ALA 10

我希望将File2中的第1列替换为File1中的第1列,仅当File1中的第2列存在于File2中的第3列时。

所以我的预期结果是:

1 MET 1
0 GLN 2
1 VAL 3
2 ILE 4
1 LEU 5
1 LEU 6
1 ASP 7
0 LYS 8
0 VAL 9
1 ALA 10

我一直在尝试使用或不使用sed,我没有得到它的工作。我知道有一个简单的答案。使用循环对我来说也没有用。

提前致谢!

1 个答案:

答案 0 :(得分:1)

<强> 尝试

awk 'FNR==NR{A[$2]=$1;next}{$1 = ( $3 in A ) ? A[$3] : 0}1' file1 file2

经过测试

akshay@Aix:/tmp$ cat f1
 1 1
 1 3
 2 4
 1 5
 1 6
 1 7
 1 10
 1 13
 1 15
 1 17


akshay@Aix:/tmp$ cat f2
0 MET 1
0 GLN 2
0 VAL 3
0 ILE 4
0 LEU 5
0 LEU 6
0 ASP 7
0 LYS 8
0 VAL 9
0 ALA 10


akshay@Aix:/tmp$ awk 'FNR==NR{A[$2]=$1;next}{$1 = ( $3 in A ) ? A[$3] : 0}1' f1 f2
1 MET 1
0 GLN 2
1 VAL 3
2 ILE 4
1 LEU 5
1 LEU 6
1 ASP 7
0 LYS 8
0 VAL 9
1 ALA 10