【问题标题】:How do I conditionally replace a column from one file with one from another?如何有条件地将一个文件中的列替换为另一个文件中的列?
【发布时间】:2014-12-18 11:51:30
【问题描述】:

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

我想用 File1 中的第 1 列替换 File2 中的第 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 的 awk,但我没有得到它的工作。我知道有一个简单的答案。使用循环对我也不起作用。

提前致谢!

【问题讨论】:

  • 啊,很抱歉没有把我的尝试放进去
  • @NicholasKovacs 短语“仅当 File1 中的第 2 列作为 File2 中的第 3 列存在时”对我来说没有意义,您能否更好地解释您的要求?此外,在您的示例输出中,我在第 4 行的第一列中看到一个“2”,但在 File1 中,我在相应位置看到一个“1”。
  • 看了Akshay的回答我明白你的意思了,打扰了。
  • 感谢收看!我的帖子不清楚,以后一定会澄清

标签: unix awk sed


【解决方案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

【讨论】:

  • 这太完美了,谢谢!里面有几个我不知道如何使用的结构,但现在我明白了它们的作用。
  • @NicholasKovacs 很高兴知道它对您有所帮助。
猜你喜欢
  • 2018-12-27
  • 2011-12-12
  • 2016-07-12
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多