1

私のコマンドは次のようになります。

カット -f 1 ダミー_ファイル | ソート | ユニーク -c | awk '{print $2}' | for i in $(cat -); grep -w $i dummy_FILE | を実行します。
awk -v VAR="$i" '{distance+=$3-$2} END {print VAR, distance}'; 終わり

cat dummy_FILE
Red   13    14
Red   39    46
Blue   45    23
Blue   34    27
Green   31    73

したいこと:
$1 dummy_FILE (赤、青、緑) のすべての単語について - $3 と $2 の差の合計を計算します。

次のような出力を取得するには:

Red 8  
Blue -29  
Green 42 

私の質問は次のとおりです。

  1. 交換は可能cut -f 1 dummy_FILE | sort | uniq -c | awk '{print $2}'ですか?
    データセットからすべての単語を抽出するために使用sort | uniq -cしています-awkでそれを行うことは可能ですか?

  2. どうすれば無駄を克服できcatますfor i in $(cat -)か?

  3. grep -w $i dummy_FILE正常に動作しますが、それを awk に置き換えたいです (すべきでしょうか?)。もしそうなら、どうすればこれを行うことができますか?
    私がしようとしているとき、awk -v VAR="$i" '/^VAR/ '{distance+=$3-$2} END {print VAR, distance}'私は得て"fatal: division by zero attempted"います。

4

2 に答える 2

4

私はそれを使用してそれを得ました:

awk '{a[$1] = a[$1] + $3 - $2;} END{for (x in a) {print x" "a[x];}}' dummy_FILE

出力:

Blue -29
Green 42
Red 8

出力を並べ替えたい場合はsort、コマンドの後に追加しますAWK

于 2013-02-05T09:46:45.417 に答える
1

を使用する 1 つの方法を次に示しawkます。

awk '{ a[$1]=a[$1] + $3 - $2 } END { for(i in a) print i, a[i] }' dummy

結果:

Red 8
Blue -29
Green 42

ソートされた出力が必要な場合は、sortアルタクが提案するように単純にパイプすることができます:

awk '{ a[$1]=a[$1] + $3 - $2 } END { for(i in a) print i, a[i] }' dummy | sort

ただし、次のように(ステートメントsort内に)出力できます。awk

awk '{ a[$1]=a[$1] + $3 - $2 } END { for(i in a) print i, a[i] | "sort" }' dummy
于 2013-02-05T09:48:40.107 に答える