Linux

如何在linux中總結每兩行的值

  • October 6, 2015

我有這樣的數據:

輸入.txt

1 0000100101000000
1 0000010100000000
2 1110000001000000
2 1111000000001000
3 0000000111111111
3 1111111100000000
4 8888345500000000
4 0000000000000000

我想用相同的行號總結每兩行中的值:輸出:

輸出.txt

1 0000110201000000
2 2221000001001000
3 1111111211111111
4 8888345500000000

請問有什麼建議嗎?我的真實數據有 8000 行,每行 45000 位

sed '
   N                                                       #append next line
   s/$/))/                                                 #add `))` to end
   s/\(\S*\s*\)\(.*\)\n\1/printf "%016d\n" \$((10#\2+10#/  #check Nos, form line
   t                                                       #to end if Nos equal
   s/))$//                                                 #remove `))`
   D                                                       #delete 1st line
   ' file |
bash

關於 45000 位數字,請注意 bash 可以處理的最大數字是

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX 9223372036854775807L
#  else
#   define LONG_MAX 2147483647L
#  endif

$$ 1 $$ /usr/include/limits.h

一個完整的解決方案怎麼樣awk

awk 'BEGIN { tag = -1; sum = 0}
   {
       if (tag != $1) {
           if (tag > -1) {printf "%d %016d\n",  tag, sum;}
           tag = $1; sum = $2
       } else { sum += $2 }
   }
   END {print tag, sum}'  input.txt

目前尚不清楚您的輸入是否按第一列排序。您可能必須執行以下操作:sort -k1.1n input.txt然後將其通過管道傳輸到上面的awk腳本中。

引用自:https://unix.stackexchange.com/questions/234147