假设我有一个文件,它有 2 列。
12,1
12,2
11,3
11,2
我想在第一列之前添加第二列。输出应如下所示
12,3
11,5
在 Linux 环境(在命令行上)有什么简单的方法可以做到这一点?
假设我有一个文件,它有 2 列。
12,1
12,2
11,3
11,2
我想在第一列之前添加第二列。输出应如下所示
12,3
11,5
在 Linux 环境(在命令行上)有什么简单的方法可以做到这一点?
在 perl 脚本中:
#!/usr/bin/env perl
use strict;
use warnings;
my %sum;
my %pos;
my $i = 0;
while(<>){
chomp;
my($x,$y) = split/,/;
$pos{$x} = $i unless exists $pos{$x};
$sum{$x} += $y;
$i++;
}
my @keys = sort { $pos{$a} <=> $pos{$b} } keys %pos;
for my $key(@keys){
print "$key,$sum{$key}\n"
}
将其放入脚本中,并将您的号码放入文件中,然后运行:
perl $script $file
这也保持秩序。Python具有类似的结构。
$ cat file
12,1
12,2
11,3
11,2
这是一种awk
方法:
$ awk -F, '$1 { a[$1]+=$2 } END { for (i in a) { printf "%s,%d\n", i, a[i] } }' file
11,5
12,3
这里有一个bash
:
$ cat ./id.sh
#!/bin/bash
IFS=','
while read id value; do
[ -n "${id}" ] || continue
(( a[id] += value ))
done < file
for id in "${!a[@]}"; do
echo "${id},${a[${id}]}"
done
$ ./id.sh
11,5
12,3
它们都按照相同的原理工作——它们逐行读取,并将它们的字段/输入分隔符设置为,
并组装一个由第一列索引的数组——第二列的值只是相加。完成所有艰苦的工作后,我们将数组打印回来。