如果原始字符串与特定字符串不匹配,则修改字符串

如果原始字符串与特定字符串不匹配,则修改字符串

我有一个包含数百万行的文件,并且仅当字符串为“.”时才想修改 A 列中的值。修改将添加"chr:"$2":"$3到字符串的开头。所有其他行将作为原始版本打印。

输入示例:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
. 3 7654 I R 8

上面,第四行以“.”开头。并且需要更改为“chr3:7654”。所有其他行需要保持不变。

期望的输出:

A B C D E F G H
rs125 2 5433 T TACA A 3 2
chr2:4543 2 4543 I R 8 2
rs123 3 4332 A C 9 3
chr3:7654 3 7654 I R 8 2

到目前为止,我的代码有效,但将所有名称更改为以“chr...”开头,即使“rs...”应保持不变:

awk '($1 ~ /^./) {$1 = "chr:"$2":"$3}1' filename > newfilename

这可能是一个非常简单的解决方案,但它引起了非常大的问题。谢谢!

答案1

你的问题是正则表达式。/^./将匹配行开头的任何有效字符。你必须转义.才能从字面上匹配它:

awk '$1 ~ /^\./ {$1 = "chr:"$2":"$3};1' filename > newfilename

但最好只检查字符串是否相等,而不是进行正则表达式检查:

awk '$1 == "." {$1 = "chr:"$2":"$3};1' filename > newfilename

相关内容