我有一个包含数百万行的文件,并且仅当字符串为“.”时才想修改 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