1

我的命令如下所示:

cut -f 1 dummy_FILE | 排序 | 唯一的-c | awk '{打印 $2}' | 对于我在 $(cat -); 做 grep -w $i dummy_FILE |
awk -v VAR="$i" '{距离+=$3-$2} END {打印 VAR,距离}'; 完毕

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. 我怎样才能克服无用catfor 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

这是一种使用方法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像 arutaku 建议的那样简单地输入:

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 回答