用另一个字符替换第 2 次和第 3 次出现的字符,对于每一行,Bash
Replace 2nd and 3rd occurrence of a character with another character, for each line, Bash
我正在尝试重新格式化参考图例文件以使其与 bcftools 兼容。
基本上,我需要从这里开始:
id position a0 a1 TYPE AFR AMR EAS EUR SAS ALL
1:123:A:T 123 A T SNP 0.01 0.01 0 0 0 0.01
1:679:A:T 123 A T SNP 0.01 0.01 0 0 0 0.01
对此:
id position a0 a1 TYPE AFR AMR EAS EUR SAS ALL
1:123_A_T 123 A T SNP 0.01 0.01 0 0 0 0.01
1:679_A_T 123 A T SNP 0.01 0.01 0 0 0 0.01
最好使用 bash。
如果 sed
是一个选项:
sed 's/:/_/2; s/:/_/2' file > reformatted_file
(此命令 s/:/_/2
将第二个“:”替换为下划线,然后将第三个“:”替换为下划线,尽管从技术上讲它现在是第二个“:” (s/:/_/2
), 因为第一个已经改过了。这样有意义吗?)
或只有 bash:
while read -r line
do
tmp="${line//:/_}"
echo "${tmp/_/:}"
done < file > reformatted_file
(*这适用于您的示例,但是用下划线替换每个“:”,然后将第一个改回“:”可能会对您的文件产生意想不到的影响,例如,它可能会弄乱您的 header)
我正在尝试重新格式化参考图例文件以使其与 bcftools 兼容。
基本上,我需要从这里开始:
id position a0 a1 TYPE AFR AMR EAS EUR SAS ALL
1:123:A:T 123 A T SNP 0.01 0.01 0 0 0 0.01
1:679:A:T 123 A T SNP 0.01 0.01 0 0 0 0.01
对此:
id position a0 a1 TYPE AFR AMR EAS EUR SAS ALL
1:123_A_T 123 A T SNP 0.01 0.01 0 0 0 0.01
1:679_A_T 123 A T SNP 0.01 0.01 0 0 0 0.01
最好使用 bash。
如果 sed
是一个选项:
sed 's/:/_/2; s/:/_/2' file > reformatted_file
(此命令 s/:/_/2
将第二个“:”替换为下划线,然后将第三个“:”替换为下划线,尽管从技术上讲它现在是第二个“:” (s/:/_/2
), 因为第一个已经改过了。这样有意义吗?)
或只有 bash:
while read -r line
do
tmp="${line//:/_}"
echo "${tmp/_/:}"
done < file > reformatted_file
(*这适用于您的示例,但是用下划线替换每个“:”,然后将第一个改回“:”可能会对您的文件产生意想不到的影响,例如,它可能会弄乱您的 header)