【问题标题】:Replace values of one column based on other column conditions in shell根据 shell 中的其他列条件替换一列的值
【发布时间】:2021-05-18 19:47:55
【问题描述】:

我在下面有一个制表符分隔的文本文件。我想匹配第 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。

【问题讨论】:

  • @mattb 是的。我可以一次做一个,但不能同时匹配 X 和 Y。像X|Y

标签: bash shell awk sed


【解决方案1】:

使用 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

【讨论】:

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

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 2019-02-12
      • 2020-11-17
      • 2021-02-20
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      相关资源
      最近更新 更多