我目前有一个由标签分隔的文件,我试图将第三列增加0.05。
示例:
2999 comp .20
2993 EE .10
2949 CS .17
2799 CE .30
我希望得到以下结果:
2999 comp .25
2993 EE .15
2949 CS .22
2799 CE .35
到目前为止,我尝试使用返回以下内容的awk '{sub(/[[:digit:]]+$/,$NF+.05)}1' filename.txt
:
2999 comp .0.3
2993 EE .0.2
2949 CS .0.27
2799 CE .0.4
在将数字递增小数的同时保留格式的正确方法是什么?
答案 0 :(得分:3)
如果要在列之间保留TAB
,请输入以下代码:
awk -v OFS='\t' '$3+=0.05' [Your_File]
输出是:
2999 comp .25
2993 EE .15
2949 CS .22
2799 CE .35
答案 1 :(得分:1)
我认为解析字符串是最简单的方法。
$ cat r.sh
# w, s: regexps matching "word" or "space" (delimiter)
# nxt(): sets T (type: "W" or "S") and P (pattern), and "eats" $0
# pp[], tt[]: parallel arrays with patterns and types
awk '
function transform(t, cnt, x) {
return (t == "W" && cnt == 3 ) ? x + 0.05 : x
}
BEGIN {
w = "^[^ \t]+"
s = "^[ \t]+"
}
{
for (n = 0; nxt(); n++) {
pp[n] = P; tt[n] = T
}
for (iw = i = 0; i < n; i++) {
if (tt[i] == "W") iw++
printf "%s", transform(tt[i], iw, pp[i])
}
printf "\n"
}
function nxt() {
if (match($0, w)) {T = "W"; P = nxt0(); return 1 }
else if (match($0, s)) {T = "S"; P = nxt0(); return 1 }
else return 0
}
function nxt0( p) {
p = substr($0, 1, RLENGTH)
$0 = substr($0, RLENGTH + 1)
return p
}
' "$@"
用法:
$ sh r.sh file
2999 comp 0.25
2993 EE 0.15
2949 CS 0.22
2799 CE 0.35