基于列的文件中的条件替换

时间:2016-05-19 22:26:09

标签: bash awk

我有一个包含多个列的文件,如下所示:

MARKER      EA  NEA N_x        EA_y NEA_y N_y
rs1000000   G   A   231410.0    G   A     118230.0
rs10000010  T   C   322079.0    C   T     118230.0
rs10000017  C   T   233146.0    C   T     118230.0
rs10000023  G   T   233860.0    T   G     118230.0
rs10000027  C   G   72852.4     C   G     118230.0
rs10000029  T   C   179950.0    NA  NA    NA    
rs1000002   C   T   233932.0    C   T     118230.0

我想用EA_y和NEA_y中的值替换EA和NEA列中的值,但如果EA_y和NEA_y是NA,那么我想保留EA和NEA中的值。 我可以在R中使用ifelse但是我想学习如何使用awk或类似内容。 注意:该文件大约有300万行

2 个答案:

答案 0 :(得分:1)

使用awk可以轻松完成:

awk '$5 != "NA" && $6 != "NA" {$2=$5; $3=$6} 1' file | column -t

MARKER      EA_y  NEA_y  N_x       EA_y  NEA_y  N_y
rs1000000   G     A      231410.0  G     A      118230.0
rs10000010  T     C      322079.0  T     C      118230.0
rs10000017  C     T      233146.0  C     T      118230.0
rs10000023  G     T      233860.0  G     T      118230.0
rs10000027  C     G      72852.4   C     G      118230.0
rs10000029  T     C      179950.0  NA    NA     NA
rs1000002   C     T      233932.0  C     T      118230.0

我使用column -t进行输出的表格格式化。

答案 1 :(得分:0)

由于字段5,6,7始终同时设置为“NA”,因此您可以使用:

awk -v OFS="\t" 'NR>1&&$7!="NA"{$2=$5;$3=$6}1' file

如果要继续使用多个文件,请避免在ls命令的输出上使用循环,最好使用find来更好地控制路径的显示方式。< / p>