从以特定数字结尾的值中减去?

Subtracting from values ending with specific digits?

我有一个 .bed (.tsv) 文件,如下所示:

chr1    0   100000
chr1    100000  200000
chr1    200000  300000
chr1    300000  425234

我想使用 sed 或 awk 仅从第 3 列中以“000”结尾的值执行操作 -1,以便输出如下所示:

chr1    0   99999
chr1    100000  199999
chr1    200000  299999
chr1    300000  425234

令人尴尬的是,我想到的最好的是:


awk {sub(/000$/,"999",); print ,,}' oldfile > newfile

这只是将最后 3 位数字替换为 999,而不是实际减去。 任何帮助都将不胜感激!

Awk 也可以轻松地执行算术运算。

awk 'BEGIN{FS=OFS="\t"}  ~ /000$/ { -= 1}1' oldfile > newfile

这是假设您文件中的所有行始终具有三个字段并且您想要打印所有行。

sed连最简单的算术都不懂所以不是特别适合做这个

我将按如下方式使用 GNU AWK,令 file.txt 内容为

chr1    0   100000
chr1    100000  200000
chr1    200000  300000
chr1    300000  425234

然后

awk 'BEGIN{OFS="\t"}(%1000==0){-=1}{print}' file.txt

输出

chr1    0   99999
chr1    100000  199999
chr1    200000  299999
chr1    300000  425234

解释:使用制表符(\t)作为输出字段分隔符(OFS)。如果 </code> 除以 <code>1000 的余数为零(即 </code> 是 <code>1000 的乘积),则每行从 </code> 中减去 <code>1 print.

(在 gawk 4.2.1 中测试)