尝试将awk命令的输出分配给数组

时间:2013-07-13 07:49:53

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

非常感谢。

5 个答案:

答案 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提出和输入的问题。