2013-04-19 65 views
-2

假設我有一個文件,其中有2列。最好的方式來合併ids號碼

12,1 
12,2 
11,3 
11,2 

我想在第一列添加第二列。 輸出應該是這樣的

12,3 
11,5 

有沒有簡單的方法來做到這一點在Linux環境(命令行)?

+0

在每一種語言中,你都會以這樣或那樣的方式來實現。你想要哪一個? – 2013-04-19 23:58:02

+0

我想使用腳本語言(如python或bash腳本)來執行此操作 – codereviewanskquestions 2013-04-19 23:59:27

+0

輸出順序是否重要(12-> 11與11-> 12)? – 2013-04-20 00:05:04

回答

0
$ 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 

他們用同樣的原理都工作 - 他們逐行讀出他們的場/輸入分隔符設置爲,,然後組裝一個由第一列索引的數組 - 第二列的值將被總結。當所有艱苦的工作完成後,我們會打印出陣列。

+0

非常感謝! – codereviewanskquestions 2013-04-20 00:33:17

1

在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有一個相似的結構。