我有一个包含多列的文件。从第4列开始的每列具有2个部分,一个在#之前的部分和一个在##之后的部分。如果#之后的数字是>20,则我想将#和后面的数字替换为null,如0|0#99将变为0|0>20.如果后面跟有#的数字<20,则我想用"./"替换整个单元格值"像0|0#14正在变成"./"&";。如果#后面有一个点,那么它的值就像0|0#一样。将是0|0#。
input_file.txt.tab分隔文件我有
1 12345 A T 0|0#. 0|0#. 0|0#14 0|0#. 0|0#. 0|0#20 0|0#15 0|0#40 0|0#99
1 78906 C T 0|0#99 0|0#. 0|0#10 0|0#. 0|0#45 0|0#20 0|0#95 0|0#78 0|0#99
输出>20
1 12345 A T 0|0#. 0|0#. ./. 0|0#. 0|0#. ./. ./. 0|0 0|0
1 78906 C T 0|0 0|0#. ./ 0|0#. 0|0 ./. 0|0 0|0 0|0
我尝试了以下代码,但没有得到所需的输出。请帮我解决这个
awk -v FS="t" -v OFS="t" '{ for(i=1;i<=NF;i++) if ( $1 ~ /#[>20]/ ) {print $0} else; {print"./."}}' input_file.txt
对于您的有限输入:
sed 's%0|0#1*[0-9] %./. %g; s/0|0#[2-9][0-9] /0|0 /g' input_file.txt
- 重要的是要为替换找到一个不是正斜杠的字符
<20
匹配为1*[0-9]
(钞票尾部空格(>=20
就是[2-9][0-9]
- 使用glob替换
确认。我看到你说";选项卡已分离"粘贴到我的系统中有空格。-空格变成制表符:
sed 's%0|0#1*[0-9]t%./.t%g; s/0|0#[2-9][0-9]t/0|0t/g' input_file.txt
这个awk
命令应该完成以下任务:
awk -v cutoff=20 '
BEGIN { FS=OFS="t" }
{ for (i=5; i<=NF; ++i)
if ($i ~ /#[0-9]/) {
sub(/.*#/, "", $i)
$i = $i>cutoff ? "0|0" : "./."
}
} 1
' input_file.txt