2015-04-21 32 views
1

我在bash中有兩個語句,我想合併,以便輸出全部在一個文件中。有沒有辦法將這些結合起來?第二行基本上做的是在文件底部添加一個總行數。我希望它與文件的格式一致,這就是爲什麼我想以某種方式將兩者結合起來的原因。任何幫助將不勝感激!添加總行數到文件bash的結尾

grep -E -o -r "\b[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" $ARCHIVE | sed 's/.*@//' | sort -r | uniq -ic | sort -nr | sed 's/^ *//g' | awk ' { t = $1; $1 = $2; $2 = t; print; } ' | column -t > temp2 



echo Total "$(wc -l < temp2)" 
+1

停止。你永遠不需要20條命令和管道鏈來操縱文本。所有你需要的是一個清晰,簡單,awk命令來做那些管道連接,然後調整它以在最後添加一行數是絕對微不足道的。如果您發佈了一些示例輸入(即$ ARCHIVE的內容)和預期輸出,那麼我們可以爲您提供幫助。我不會批評你已經擁有的所有東西,而只是說'{t = $ 1; $ 1 = $ 2; $ 2 = t;打印; }' - 一個簡單的'{print $ 2,$ 1}'可以工作。 –

回答

2

awk在記錄行數方面做得很好。更換

awk ' { t = $1; $1 = $2; $2 = t; print; }' 

有了:

awk ' { t = $1; $1 = $2; $2 = t; print; } END{print "Total",NR}' 

在awk中,NR是已經讀取記錄(行)的數量。 END塊只有在所有行被讀取後才執行。因此,這將總數計算在文件末尾,不需要最終的陳述。

+2

更好的是,用Awk腳本替換整個管道。它只是計算(簡單近似地)電子郵件地址中的唯一域名數量。 – tripleee

+1

@EdMorton(a)OP寫道_「我希望它與文件的格式對齊_」。所以,是的,影響最後的'列-t'是目標。 (b)你和Tripleee關於整個管道的建議當然是正確的。但是,如上所述,OP沒有提供樣本輸入和期望的輸出。 – John1024

0

更換

| column -t > temp2 

| column -t | tee temp2 | wc -l 
0

沒有任何樣品輸入要測試的,甚至看,這顯然是未經測試,包括一些猜測的工作,但它基本上是正確的做法(使用GNU awk並假設「$ ARCHIVE」是一個目錄):

find "$ARCHIVE" -type f -print | 
xargs awk ' 
BEGIN { FPAT="[[:alnum:]_%+-][email protected][[:alnum:]_%+-]+[.][[:alpha:]]{2,6}" } 
{ 
    $0 = tolower($0) 
    for (i=1;i<=NF;i++) { 
     sub(/.*@/,"",$i) 
     cnt[$i]++ 
     width = (length($i) < width ? width: length($i)) 
    } 
} 
END { 
    PROCINFO["sorted_in"] = "@ind_val_desc" 
    for (host in cnt) { 
     printf "%-*s %s\n", width, host, cnt[host] 
    } 
    printf "%-*s %s\n", width, "Total", length(cnt) 
}'