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
与 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