Попытка назначить вывод команды 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

Ответ 2

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

Ответ 3

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

Это не выдаст ничего, если на входе есть 1 или меньше строк. В противном случае он печатает весь ввод. Он эффективен, потому что он хранит только первую строку, поэтому он не тратит память на сохранение всего входа в массиве.

Ответ 4

Вы можете просто сохранить вывод awk в файле и затем подсчитать строки файла.

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

Ответ 5

В случае, если кто-то в будущем будет читать это и задается вопросом, как получить многострочный 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.