2 つの列を持つファイルがあるとします。
12,1
12,2
11,3
11,2
最初の列で2番目の列を追加したい。出力は次のようになります
12,3
11,5
Linux環境で(コマンドラインで)これを行う簡単な方法はありますか?
2 つの列を持つファイルがあるとします。
12,1
12,2
11,3
11,2
最初の列で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
そしてここに1つ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
どちらも同じ原理で動作します。フィールド/入力セパレーターを に設定して行ごとに読み取り,
、最初の列でインデックス付けされた配列を組み立てます。2 番目の列の値は単に合計されます。すべてのハードワークが完了したら、配列を出力します。