我有一个问题。我有一个坐标(TAB
分隔)
2 10
35 50
90 200
400 10000
...
我想从第一行的第二列中减去第二行的第一列,即计算距离,即我想要一个文件
25
40
200
...
我怎么能用awk做到这一点? 非常感谢您提前
答案 0 :(得分:6)
这是一个awk单行可能会帮助你:
kent$ awk 'a{print $1-a}{a=$2}' file
25
40
200
答案 1 :(得分:1)
这是一个纯粹的bash解决方案:
{
read _ ps
while read f s; do
echo $((f-ps))
((ps=s))
done
} < input_file
这只适用于你有(小)整数的情况,因为它使用了bash的算术。如果你想处理任意大小的整数或浮点数,你可以使用bc
(只有一个分支):
{
read _ ps
while read f s; do
printf '%s-%s\n' "$f" "$ps"
ps=$s
done
} < input_file | bc
现在我让其他人给出一个awk答案!
好吧,既然没有人愿意回答我的回答,这是一个非常有趣的解决方案,使用bash和bc
:
a=( $(<input_file) )
printf -- '-(%s)+(%s);\n' "${a[@]:1:${#a[@]}-2}" | bc
或与dc
相同(较短但不适用于负数):
a=( $(<input_file) )
printf '%s %sr-pc' "${a[@]:1:${#a[@]}-2}" | dc
答案 2 :(得分:1)
使用sed和ksh进行评估
sed -n "
1x
1!H
$ !b
x
s/^ *[0-9]\{1,\} \(.*\) [0-9]\{1,\} *\n* *$/\1 /
s/\([0-9]\{1,\}\)\(\n\)\([0-9]\{1,\}\) /echo \$((\3 - \1))\2/g
s/\n *$//
w /tmp/Evaluate.me
"
. /tmp/Evaluate.me
rm /tmp/Evaluate.me