1

我有个问题。我有一个带坐标的文件(TAB分隔)

2 10
35 50
90 200
400 10000
...

我想从第一行的第二列中减去第二行的第一列,即计算距离,即我想要一个文件

25
40
200
...

我怎么能用awk做到这一点???非常感谢您提前

4

3 回答 3

6

这是一个 awk one-liner 可以帮助你:

kent$  awk 'a{print $1-a}{a=$2}'  file
25
40
200
于 2013-10-29T10:51:59.590 回答
1

这是一个纯粹的解决方案:

{
    read _ ps
    while read f s; do
        echo $((f-ps))
        ((ps=s))
    done
} < input_file

这仅在您有(小)整数时才有效,因为它使用 bash 的算术。如果你想处理任意大小的整数或浮点数,你可以使用bc(只有一个 fork):

{
    read _ ps
    while read f s; do
        printf '%s-%s\n' "$f" "$ps"
        ps=$s
    done
} < input_file | bc

现在我让其他人给出一个 awk 答案!


好吧,既然没有人愿意支持我的回答,这里有一个非常有趣的解决方案,它使用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
于 2013-10-29T10:46:45.420 回答
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
于 2013-10-29T13:13:35.587 回答