我有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,那么我想显示这个数组的内容。你能帮忙吗?
非常感谢。
答案 0 :(得分:1)
awk '{s[c++]=$0} END { if (c>1) { for (c in s) { print s[c]; } } }'
答案 1 :(得分:1)
... | awk 'NR == 1 {first=$0} NR == 2 {print first} NR > 1 {print}'
如果输入中有1行或更少行,则不输出任何内容。否则它会打印整个输入。这是有效的,因为它只存储第一行,所以它不会浪费内存将整个输入存储在一个数组中。
答案 2 :(得分: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
答案 3 :(得分:0)
您可以将awk的输出存储在文件中,然后计算文件的行数。
TEMP_FILE=`mktemp`
awk_command > $TEMP_FILE
if [[ `wc -l < $TEMP_FILE` -gt 1 ]]
then
cat $TEMP_FILE
fi
rm $TEMP_FILE
答案 4 :(得分: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提出和输入的问题。