使用linux脚本的简单聚合
假设我有一个文本文件,其中有如下行:使用linux脚本的简单聚合,linux,bash,awk,Linux,Bash,Awk,假设我有一个文本文件,其中有如下行: foo 10 bar 15 bar 5 foo 30 ... 生成以下输出的最简单方法是什么: foo 40 bar 20 ?这样做可以: awk '{arr[$1]+=$2;} END { for (i in arr) print i, arr[i]}' file 有关更多信息,请阅读Awk的关联数组。使用此Awk脚本: awk '{sums[$1] += $2} END {for (a in sums) print a, sums[a]}' in
foo 10
bar 15
bar 5
foo 30
...
生成以下输出的最简单方法是什么:
foo 40
bar 20
?这样做可以:
awk '{arr[$1]+=$2;} END { for (i in arr) print i, arr[i]}' file
有关更多信息,请阅读Awk的关联数组。使用此Awk脚本:
awk '{sums[$1] += $2} END {for (a in sums) print a, sums[a]}' infile
输出:
foo 40
bar 20
:如果您对perl感兴趣:
perl -F -lane '$X{$F[0]}=$X{$F[0]}+$F[1];if(eof){foreach (keys %X){print $_." ".$X{$_}}}' your_file
以下是排序、GNU sed和bc的一种方法:
sort infile |
sed -r ':a; N; s/([^ ]+) +([^\n]+)\n\1/\1 \2 +/; ta; P; D' |
sed -r 'h; s/[^ ]+/echo/; s/$/ | bc/e; G; s/([^\n]+)\n([^ ]+).*/\2 \1/'
输出:
bar 20
foo 40
第一个sed使用相同的键连接相邻的行,在数字之间添加一个
+
,第二个sed将总和传递给bc。这取决于“最简单”的定义,但printf'foo 40\nbar 20\n'
似乎并不合理。