Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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
Bash awk求和一列并在每行输入上打印该和_Bash_Sed_Awk_Printf - Fatal编程技术网

Bash awk求和一列并在每行输入上打印该和

Bash awk求和一列并在每行输入上打印该和,bash,sed,awk,printf,Bash,Sed,Awk,Printf,我的file.txt如下所示: 1 12 2 18 3 45 4 5 5 71 6 96 7 13 8 12 我可以这样对第二列求和: awk'{sum+=$2}END{print sum}'file.txt 272 我可以用什么最简洁的方式在每一行上打印那个总和?这就是我所期待的: 1 12 272 2 18 272 3 45 272 4 5 272 5 71 272 6 96 272 7 13 272 8 12 272 Offtopic,但在Perl中,您可以执行以下操作: perl -

我的
file.txt
如下所示:

1 12
2 18
3 45
4 5
5 71
6 96
7 13
8 12
我可以这样对第二列求和:

awk'{sum+=$2}END{print sum}'file.txt

272

我可以用什么最简洁的方式在每一行上打印那个总和?这就是我所期待的:

1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272

Offtopic,但在Perl中,您可以执行以下操作:

perl -nale '$s+=$F[1];push(@a,$_);END{print $_." $s" for(@a);}' file.txt
您可以使用:

awk -v xyzzy=$(awk '{sum+=$2}END{print sum}' file.txt)
    '{print $0" "xyzzy}' file.txt
不幸的是,这意味着要对这些信息进行两次检查,但是,由于在得到总数之前必须进行一次检查,因此没有真正的解决方法。任何解决方案都需要在输出任何内容(无论是数组还是返回文件)之前存储信息

内部
awk
计算出总数,外部
awk
将其分配给一个变量,该变量可以与每行一起打印

将其应用于文件:

a 1
b 2
c 3
d 4
e 5
给你,因为
1+2+3+4+5
等于
15

a 1 15
b 2 15
c 3 15
d 4 15
e 5 15
使用数组

{ 
    a[NR] = $0
    sum += $2
}
END {
    for (x = 1; x <= NR; x++) {
        print a[x], sum
    }
}

以标准的方式阅读更多内容

$ awk 'FNR==NR{sum+=$2;next}; {print $0,sum}' file.txt{,}
1 12 272
2 18 272
3 45 272
4 5 272
5 71 272
6 96 272
7 13 272
8 12 272
丑陋的解决方案:

awk '{printf "%s ", $0}{system(" awk \047 {sum+=$2}END{print sum} \047  file ")}' file

哦,是的,头和浆糊

$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -

$yes“`@codaddict:你的意思是“。。。无法存储。。。“?
{,}
通配符后缀是两次重复输入文件名的缩写。它不是标准的Bourne shell。这是规范的AWK,不将文件存储在内存中。它应该是可接受的答案。@Dennis Williamson,您好,请您解释一下这个AWK不将文件存储在内存中的原因?thanks@Afshin.Hamedi:上一个以前接受的答案使用数组存储文件的所有行,然后在
END
子句中打印它们(以及总和)。它的优点是只读取文件一次。此答案读取每行,但不将它们存储在数组中,从而节省内存(如果文件很大,则尤为重要).不过,它确实读了两遍文件。谢谢大家!这里有一些非常有用的答案。干杯。
$ yes "`<file.txt awk '{ sum += $2 } END { print sum }'`" | head -n `<file.txt wc -l` | paste -d ' ' file.txt -