使用cutoff替换#之后的数字,并修改多列文件中的列



我有一个包含多列的文件。从第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

相关内容

  • 没有找到相关文章

最新更新