Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用linux脚本的简单聚合_Linux_Bash_Awk - Fatal编程技术网

使用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'
似乎并不合理。