从以特定数字结尾的值中减去?
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 中测试)
我有一个 .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 中测试)