2013-07-13 45 views
0

我有以下的輸出通過AWK返回:試圖awk命令的輸出分配給數組

qh1adm 20130711151154 : tp import all QH1 u6 -Dsourcesystems=BFI,EBJ 
qh1adm 20130711151155 : tp import all QH1 u6 -Dsourcesystems=E7B,B17 
qh1adm 20130711151200 : tp import all QH1 u6 -Dsourcesystems=BFI,EBJ 

我想這些信息存儲在有序的陣列來計算的記錄數。如果它超過1,那麼我想顯示這個數組的內容。你能協助嗎?

非常感謝。

回答

1

使用bash/zsh中,捕獲輸出,算上線,並打印出來,如果符合您的條件:

output=$(awk 'something that returns what you showed in your question') 
nlines=$(wc -l <<< "$output") 
if ((nlines > 1)); then 
    echo "$output" 
fi 
+0

嗨格倫,這很好。非常感謝你。 – user2544767

+1

+1無視OP要求什麼,只是給他他需要的東西:-)! –

1
awk '{s[c++]=$0} END { if (c>1) { for (c in s) { print s[c]; } } }' 
+0

Hello Karoly,謝謝你的回覆。所以會是這樣的:awkcommand'{s [C++] = $ 0} END {if(c> 1){for(c in s){print s [c]; }}}' – user2544767

+0

P.S.對不起,我仍然試圖找出糾正插入換行符和預格式化文本的正確方法。 – user2544767

+0

我不明白其中的任何一個問題,你必須*更多*特定。我不知道你的awk腳本是什麼,所以我不知道如何將這兩者結合起來......但是你可以只用''''''''''''' awk ...'。 –

0

您可以將awk的輸出存儲在文件中,然後計算文件的行數。

TEMP_FILE=`mktemp` 
awk_command > $TEMP_FILE 
if [[ `wc -l < $TEMP_FILE` -gt 1 ]] 
then 
    cat $TEMP_FILE 
fi 
rm $TEMP_FILE 
+0

你好,親愛的,謝謝你的代碼。我插入上面,它完美的工作!非常感謝您的幫助。 – user2544767

1
... | awk 'NR == 1 {first=$0} NR == 2 {print first} NR > 1 {print}' 

如果有1條或更少的線路中的輸入這將輸出什麼。否則,它會打印整個輸入。它的效率很高,因爲它只存儲第一行,所以在將整個輸入存儲在數組中時不會浪費內存。

0

如果有人在將來讀這篇文章,想知道如何真正得到多行AWK輸出到一個bash數組:

$ cat ./tst.sh 
# ensure globbing is off and set IFS to a newline after saving original values 
oSET="$-"; set -f; oIFS="$IFS"; IFS=$'\n' 

array=($(
    awk 'BEGIN{ 
     print "qh1adm 20130711151154 : tp import all QH1 u6 -Dsourcesystems=BFI,EBJ" 
     print "qh1adm 20130711151155 : tp import all QH1 u6 -Dsourcesystems=E7B,B17" 
     print "qh1adm 20130711151200 : tp import all QH1 u6 -Dsourcesystems=BFI,EBJ" 
    }' 
)) 

# restore original IFS and globbing values 
IFS="$oIFS"; set +f -"$oSET" 

numElts="${#array[@]}" 

if ((numElts > 1)) 
then 
    for ((i=0; i < numElts; i++)); 
    do 
     printf "array[%d]: %s\n" "$i" "${array[$i]}" 
    done 
fi 
$ 
$ ./tst.sh tmp 
array[0]: qh1adm 20130711151154 : tp import all QH1 u6 -Dsourcesystems=BFI,EBJ 
array[1]: qh1adm 20130711151155 : tp import all QH1 u6 -Dsourcesystems=E7B,B17 
array[2]: qh1adm 20130711151200 : tp import all QH1 u6 -Dsourcesystems=BFI,EBJ 

但顯然都不是在這種情況下,實際需要和整個事情或許應該只是一個awk命令內完成。

以上內容已更新,以解決以下由@CharlesDuffy提出的問題和輸入內容。

+1

這實際上並不安全:'array =($(stuff))''在'stuff'的輸出中進行了字符串分割和glob擴展,使得很難確保結果以您想要的方式完全恢復。一個更安全的方法是讓awk發出NUL分隔的條目,並使用'array =();同時讀取-r -d''; do array + =(「$ REPLY」);完成<<(awk ...)'來讀取它們。 –

+0

...要更清楚一點 - 假設你的awk輸出中只包含'*'的行;在被放入'array'之前,它將被當前目錄中的文件列表替換。 –

+0

你說的glob擴張是個問題。你能舉一個例子說明什麼時候分割字符串會成爲一個問題?我真的很討厭必須寫出你建議只填充數組的那個循環,我寧願只聲明glob擴展是一個警告。除了轉義打印中的每個全局元字符之外,您還有其他建議嗎? –