如何将字母的多次出现统一替换为该字母?求awk处理文件列方案
解决第三列混合字符统一替换的问题
嘿,我明白你的需求了——要把文件第三列里混着大小写的A/a、T/t统一转成纯大写的A或T,同时删掉那些无关的点、逗号对吧?试试这个awk命令,完美适配你的场景:
awk '{ # 把第三列里所有A/a替换成大写A gsub(/[Aa]/, "A", $3) # 把第三列里所有T/t替换成大写T gsub(/[Tt]/, "T", $3) # 删掉第三列里所有非A/T的字符(比如.、,这些) gsub(/[^AT]/, "", $3) # 输出处理后的整行 print }' your_input_file.txt
测试一下你的示例输入:
输入行:
15642 G A.aa,, 0.77501 107
15643 G A.a,.A, 0.7570 17
15644 C t.TtTt,.T, 0.7501 10
运行命令后输出:
15642 G A 0.77501 107
15643 G A 0.7570 17
15644 C T 0.7501 10
完全符合你的预期!
如果你的第三列只会包含A/a或者T/t其中一种,还可以用更简洁的写法,直接匹配提取后替换:
awk '{ $3 = ($3 ~ /[Aa]/) ? "A" : ($3 ~ /[Tt]/) ? "T" : $3 print }' your_input_file.txt
这个写法逻辑是:如果第三列包含A/a,就设为"A";如果包含T/t,就设为"T";否则保持原样(不过你的场景里应该用不上最后这个分支)。
内容的提问来源于stack exchange,提问作者Harry Klein
相关产品推荐
相关产品推荐

