Bash 使用带有不同定界符的 sed 查找特定条件何时为真

Bash finding when specific condition is true using sed with different delimiter

Bash replace string where specific condition is true 的询问类似,我想根据先前条件替换一行的一部分,但我的分隔符必须不同,因为我要替换的部分内容包括 /。该条件也不在第一列中,而是在第二列中。

例如我的数据包括:

Location Ref Alt GT1 GT2
1_100004338 T C 0/0 0/0
1_100004339 C T 0/0 0/1
1_100004343 A G 1/1 0/0

如果我想根据 Ref 中是否有 C(第 2 列)并将所有出现的 0/0 替换为 2:

Location Ref Alt GT1 GT2
1_100004338 T C 0/0 0/0
1_100004339 C T 2 0/1
1_100004343 A G 1/1 0/0

我试过以下输入

sed "+^"C"+s+"0/0"+"2"+g" file

并得到错误

sed: -e expression #1, char 2: unknown command: `^'

我不确定它是否能给我我想要的东西,如果它能工作的话,因为 C 在第二列而不是行的开头。我尝试过使用其他方法,例如 awk BEGIN,这会降低我文件的大小。

如有任何帮助,我们将不胜感激,并在此先致谢。

awk 更适合这个。

$ awk '=="C" {=2}1' input_file
Location Ref Alt GT1 GT2
1_100004338 T C 0/0 0/0
1_100004339 C T 2 0/1
1_100004343 A G 1/1 0/0

如果 </code> 第 2 列字符串为 C,则 <code> 第 4 列等于 2。

如果sed是必须的,你可以试试这个。

$ sed '/[^ ]* C [A-Z]/ {s|0/0|2|}' input_file
Location Ref Alt GT1 GT2
1_100004338 T C 0/0 0/0
1_100004339 C T 2 0/1
1_100004343 A G 1/1 0/0

这可能对你有用 (GNU sed ):

sed '/^\S\+ C /s#0/0#2#g' file

如果第二列是 C 将所有出现的 0/0 替换为 2


或者如果您愿意:

sed -E '/^\S+\s+C\s+/s#0/0#2#g' file