2017-01-20 36 views
1

如果滿足一些awk條件,我有一個我想要粘貼到主文件(bar)的文件列表。用bash有條件地粘貼文件if和awk循環

for foo in *; 
do 
    if awk '*condition* {exit 1}' $foo 
    then        
    :       
    else 
    paste $foo > bar 
    fi 
done 

但是,它看起來像只有最後粘貼的文件是在酒吧。不應該每次都添加新列到欄中,而不是完全覆蓋所有數據?

File1 File2 Expected_Output Actual_Output 
1 4  1 NaN 1 4 1 NaN   1 NaN 
2 5  2 7  2 5 2 7   2 7 
3 6  3 8  3 6 3 8   3 8 
+1

請注意,您正在使用'paste $ foo> bar',這會刪除'bar'中的任何以前的內容。你可能想用'>>'來追加。 – fedorqui

回答

7

paste命令在迴路中的每次迭代,這說明,在結束時,你只有最後一個文件將覆蓋文件bar

declare -a FILES=() 
for foo in *; 
do 
    if awk '*condition* {exit 1}' $foo 
    then        
    :       
    else 
    FILES+=("$foo") 
    fi 
done 
paste "${FILES[@]}" > bar 

此代碼聚集在一個名爲FILES陣列符合您的條件,所有的文件名,並調用paste只有一次,展開所有文件名到個人,引用參數(這就是"${FILES[@]}"那樣),重定向輸出到bar文件。

此外,還可以整體更換,如果用/然後/ else塊:

awk '*condition* {exit 1}' "$foo" || FILES+=("$foo") 

||表達的條件,因爲擊的執行邏輯運算符的懶評價,聲明右邊是僅在awk返回非零返回碼時才執行。

請注意我報價爲"$foo"(當傳遞給awk時),您的文件名稱將包含特殊字符。

+0

謝謝,這非常優雅地解決了這個問題。我認爲在每次迭代之後,粘貼命令應該將新列添加到文件中,類似於bash附加的「>>」。顯然情況並非如此。 – mannaroth

+1

你總是可以想象一個實用程序正在做你認爲粘貼的事情,但效率不高。請注意,我已將建議添加到了我提議的解決方案中,以便您可以進一步簡化代碼(並更正引用)。 – Fred