1

質問があります。座標付きのファイルがあります(TAB分離)

2 10
35 50
90 200
400 10000
...

最初の行の 2 番目の列から 2 番目の行の最初の列を減算したい、つまり距離を計算したい、つまり次のファイルが欲しい

25
40
200
...

awkを使用してそれを行うにはどうすればよいですか??? 事前にどうもありがとうございました

4

3 に答える 3

6

ここに awk ワンライナーが役立ちます:

kent$  awk 'a{print $1-a}{a=$2}'  file
25
40
200
于 2013-10-29T10:51:59.590 に答える
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 に答える
1

純粋なソリューションは次のとおりです。

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

これは、bash の演算を使用するため、(小さな) 整数がある場合にのみ機能します。任意のサイズの整数または浮動小数点数を処理する場合は、次を使用できますbc(フォークは 1 つだけ):

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

今、私は他の人が気まずい答えを出します!


さて、誰も私の答えに賛成票を投じたくないので、とを使用する本当に面白いソリューションを次に示し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 に答える