0

我有 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,那么我想显示这个数组的内容。你能帮忙吗?

非常感谢。

4

5 回答 5

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

如果输入中有 1 行或更少的行,这将不输出任何内容。否则它会打印整个输入。它是高效的,因为它只存储第一行,所以它不会浪费内存将整个输入存储在一个数组中。

于 2013-07-13T09:47:33.843 回答
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
于 2013-07-13T12:31:30.097 回答
1
awk '{s[c++]=$0} END { if (c>1) { for (c in s) { print s[c]; } } }'
于 2013-07-13T07:59:44.250 回答
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 提出的问题和来自下面的输入。

于 2013-07-14T14:30:34.460 回答
0

您可以将 awk 的输出存储在文件中,然后计算文件的行数。

TEMP_FILE=`mktemp`
awk_command > $TEMP_FILE
if [[ `wc -l < $TEMP_FILE` -gt 1 ]]
then
  cat $TEMP_FILE
fi
rm $TEMP_FILE
于 2013-07-13T08:01:11.510 回答