2016-04-05 67 views
0

我有2個文件,我想總結第一列取決於相同的秒數。如果沒有一個時間意味着它是零,如果時間是重複的,它意味着總計所有同時,但如何,請幫助我。總列依賴於linux中的另一列

第一個文件:

16 /home/appuser<Apr 4, 2016 11:24:46 PM EEST 
    2 /home/appuser<Apr 4, 2016 11:24:47 PM EEST 
    3 /home/appuser<Apr 4, 2016 11:24:48 PM EEST 
    1 /home/appuser<Apr 4, 2016 11:24:50 PM EEST 
    3 /home/appuser<Apr 4, 2016 11:24:51 PM EEST 
    7 /home/appuser<Apr 4, 2016 11:24:52 PM EEST 
    9 /home/appuser<Apr 4, 2016 11:24:54 PM EEST 
    8 /home/appuser<Apr 4, 2016 11:24:54 PM EEST 
    5 /home/appuser<Apr 4, 2016 11:24:55 PM EEST 

第二個文件:

6 /home/appuser<Apr 4, 2016 11:24:46 PM EEST 
    4 /home/appuser<Apr 4, 2016 11:24:49 PM EEST 
    7 /home/appuser<Apr 4, 2016 11:24:50 PM EEST 
    5 /home/appuser<Apr 4, 2016 11:24:50 PM EEST 
10 /home/appuser<Apr 4, 2016 11:24:52 PM EEST 
    6 /home/appuser<Apr 4, 2016 11:24:52 PM EEST 
10 /home/appuser<Apr 4, 2016 11:24:55 PM EEST 
    5 /home/appuser<Apr 4, 2016 11:24:57 PM EEST 

輸出:

22 /home/appuser<Apr 4, 2016 11:24:46 PM EEST 
    2 /home/appuser<Apr 4, 2016 11:24:47 PM EEST 
    3 /home/appuser<Apr 4, 2016 11:24:48 PM EEST 
    4 /home/appuser<Apr 4, 2016 11:24:49 PM EEST 
13 /home/appuser<Apr 4, 2016 11:24:50 PM EEST 
    3 /home/appuser<Apr 4, 2016 11:24:51 PM EEST 
23 /home/appuser<Apr 4, 2016 11:24:52 PM EEST 
    0 /home/appuser<Apr 4, 2016 11:24:53 PM EEST 
17 /home/appuser<Apr 4, 2016 11:24:54 PM EEST 
15 /home/appuser<Apr 4, 2016 11:24:55 PM EEST 
    0 /home/appuser<Apr 4, 2016 11:24:56 PM EEST 
    5 /home/appuser<Apr 4, 2016 11:24:57 PM EEST 
+0

你必須更多地解釋你的問題,如什麼是你輸入的內容filse和給我們你想要的結果的例子 – malmo

回答

0

嘗試使用下面的code.hope它有助於

$ awk '{a[$5]+=$1; sub(/[0-9]+/,"",$1); line[$5]=$0} 
    END{for(k in a) printf "%2d %s\n",a[k],line[k]}' first second 


13 /home/appuser<Apr 4, 2016 11:24:50 PM EEST 
3 /home/appuser<Apr 4, 2016 11:24:51 PM EEST 
23 /home/appuser<Apr 4, 2016 11:24:52 PM EEST 
17 /home/appuser<Apr 4, 2016 11:24:54 PM EEST 
15 /home/appuser<Apr 4, 2016 11:24:55 PM EEST 
22 /home/appuser<Apr 4, 2016 11:24:46 PM EEST 
2 /home/appuser<Apr 4, 2016 11:24:47 PM EEST 
5 /home/appuser<Apr 4, 2016 11:24:57 PM EEST 
3 /home/appuser<Apr 4, 2016 11:24:48 PM EEST 
4 /home/appuser<Apr 4, 2016 11:24:49 PM EEST 
+0

@ Leo Oo你能解釋一下你的輸出有什麼問題嗎?因爲它太擁擠了,我無法找到錯誤。 –

0

在你原來的問題中,你把輸出包含了總和爲0的時間,我不確定那是從哪裏來的 - 假定這些額外的數據你不必擔心以下內容將基於匹配列2。這可以擴展到儘可能多的文件,因爲你需要,只需將它們添加到文件列表中輸入貓 - ><(cat f1.txt f2.txt f3.txt ... fn.txt)

unset myarr && declare -A myarr 
while read a; do 
col1=$(cut -d' ' -f1 <<< "${a}") 
col2=$(cut -d' ' -f3- <<< "${a}") 
let myarr["${col2}"]+="${col1}" 
done < <(awk '{var=$1; $1=""; print var,$0}' <(cat f1.txt f2.txt)) 
for a in "${!myarr[@]}"; do echo "${myarr["$a"]} ${a}"; done 
+0

'unset && declare'對我來說似乎是一個特別危險的習慣用法,因爲你們都不需要'unset',如果'unset'失敗了*絕對*不想再次聲明數組。 –

+0

@Etan'unset'不會「失敗」,它將返回true,無論該代碼是否僅用於演示如何使用bash數組來解決此問題。在一個真正的解決方案中,邏輯可能應該封裝在一個函數中。 –

+0

如果變量是隻讀的,它*會*失敗。 (雖然這裏的其他一切都會失敗,但我還是承認這一點。)但更重要的是,這不是一個安全的成語或想法。您不會在某些其他未設置的嘗試(至少不需要釋放內存時)的情況下進行賦值(隱式取消之前的值)。 –

1

這變得相當棘手,由於插入0和失蹤日期的要求。

這裏是sort一個awk,您可以使用:

awk -F '<| /' '{ 
    cmd="date -d \"" $3 "\" +%s" 
    cmd | getline ts 
    close(cmd) 

    if (p>0 && (ts-p)>1) { 
     for(i=p+1; i<ts; i++) { 
     sums[i]=0 
     cmd="TZ=EET date -d @" i " \"+%b%e, %Y %r %Z\"" 
     cmd | getline tsi 
     close(cmd) 
     data[i]= "/" c2 "<" tsi 
     } 
    } 

    sums[ts]+=$1 
    data[ts]="/" $2 "<" $3 
    p = ts 
    c2 = $2 
} 
END { 
    for (i in sums) 
     printf "%4d%s%s\n", sums[i], OFS, data[i] 
}' <(sort -t'<' -k2 file1 file2) 

輸出:

22 /home/appuser<Apr 4, 2016 11:24:46 PM EEST 
    2 /home/appuser<Apr 4, 2016 11:24:47 PM EEST 
    3 /home/appuser<Apr 4, 2016 11:24:48 PM EEST 
    4 /home/appuser<Apr 4, 2016 11:24:49 PM EEST 
    13 /home/appuser<Apr 4, 2016 11:24:50 PM EEST 
    3 /home/appuser<Apr 4, 2016 11:24:51 PM EEST 
    23 /home/appuser<Apr 4, 2016 11:24:52 PM EEST 
    0 /home/appuser<Apr 4, 2016 11:24:53 PM EEST 
    17 /home/appuser<Apr 4, 2016 11:24:54 PM EEST 
    15 /home/appuser<Apr 4, 2016 11:24:55 PM EEST 
    0 /home/appuser<Apr 4, 2016 11:24:56 PM EEST 
    5 /home/appuser<Apr 4, 2016 11:24:57 PM EEST 
+0

我試過但輸出是這樣的; ./stack.sh file1 file2 file3 3/home/appuser

+0

'stack.sh'裏面有什麼?你爲什麼要傳遞'file1 file2 file3',因爲你在問題中只顯示了2個輸入文件。 – anubhava