linux / ubuntu awk匹配唯一值(而不是bash“sort unique grep”唯一值)

时间:2013-02-05 09:31:29

标签: awk grep

我的命令如下:

  

cut -f 1 dummy_FILE |排序| uniq -c | awk'{print $ 2}'| for $ 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"

2 个答案:

答案 0 :(得分: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

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

如果你需要排序输出,你可以像arutaku建议的那样直接输入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