根据shell中的其他列条件替换一列的值

时间:2021-05-18 19:47:55

标签: bash shell awk sed

我在下面有一个制表符分隔的文本文件。我想匹配第 2 列中的值并替换第 5 列中的值。条件是如果第 2 列中有 X 或 Y,我希望第 5 列具有 1,就像下面的结果一样。

1:935662:C:CA   1       0       935662  0
1:941119:A:G    2       0       941119  0
1:942934:G:C    3       0       942934  0
1:942951:C:T    X       0       942951  0
1:943937:C:T    X       0       943937  0
1:944858:A:G    Y       0       944858  0
1:945010:C:A    X       0       945010  0
1:946247:G:A    1       0       946247  0

结果:

    1:935662:C:CA   1       0       935662  0
    1:941119:A:G    2       0       941119  0
    1:942934:G:C    3       0       942934  0
    1:942951:C:T    X       0       942951  1
    1:943937:C:T    X       0       943937  1
    1:944858:A:G    Y       0       944858  1
    1:945010:C:A    X       0       945010  1
    1:946247:G:A    1       0       946247  0

我尝试了 awk -F'\t' '{ $5 = ($2 == X ? 1 : $2) } 1' OFS='\t' file.txt,但我不确定如何一步匹配 X 和 Y。

2 个答案:

答案 0 :(得分:3)

使用awk:

awk 'BEGIN{FS=OFS="\t"} $2=="X" || $2=="Y"{$5="1"}1' file

输出:

1:935662:C:CA   1       0       935662  0
1:941119:A:G    2       0       941119  0
1:942934:G:C    3       0       942934  0
1:942951:C:T    X       0       942951  1
1:943937:C:T    X       0       943937  1
1:944858:A:G    Y       0       944858  1
1:945010:C:A    X       0       945010  1
1:946247:G:A    1       0       946247  0

见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

答案 1 :(得分:2)

假设如果条件为假,您希望 $5 为零(而不是保持不变):

$ awk 'BEGIN{FS=OFS="\t"} {$5=($2 ~ /^[XY]$/)} 1' file
1:935662:C:CA   1       0       935662  0
1:941119:A:G    2       0       941119  0
1:942934:G:C    3       0       942934  0
1:942951:C:T    X       0       942951  1
1:943937:C:T    X       0       943937  1
1:944858:A:G    Y       0       944858  1
1:945010:C:A    X       0       945010  1
1:946247:G:A    1       0       946247  0