Linux
如何在linux中總結每兩行的值
我有這樣的數據:
輸入.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
腳本中。