2016-09-23 5 views
0

Я пытаюсь проверить конец своих файлов для проверки ошибок. Я пытаюсь работать с awk, но значения, рассчитанные в awk, не могут быть возвращены в мой bash.Bash: проверить значения в файле

s=0 
f=0 

for ((i=0;i<num_inf;i++)) do 
    ii=${inf[$i]} 

    for ((j=0;j<num_gro;j++)) do 
     jj=${gro[$j]} 

     for ((k=0;k<num_tri;k++)) do 
      kk=${tri[$k]} 
      awk 'END{x=($2+$8);if($x<10) ((f++)) ;else ((s++))}' $ii/$jj/$kk/out.dat 
     done 

    printf '%2s' "$s" 
    printf '%2s' "$f" 
    s=0 
    f=0 

    done 
done 

Возвращенных с и п всегда равен 0. Так как есть если-то еще испытание здесь, я надеюсь, по крайней мере, один из S, F возвращает ненулевое значение.

У кого-нибудь есть опыт использования awk? Я новичок в bash и awk. Или у кого-то есть предложение обходить awk/имеет более простое решение?

Спасибо всем.

+1

AWK работает в изоляции, поэтому его переменные не видны колотить. напечатайте значения 's' и' t', когда он достигнет конца файла, и используйте '$ (' ... ')' в bash, чтобы зафиксировать этот результат. – Jasen

+0

Если вы печатаете число из awk, это число может быть прочитано вашим сценарием оболочки, отправив его в команду чтения. – blackpen

+0

Поскольку это защищенная среда, я думаю, вы можете использовать 'eval' следующим образом: ' eval '$ (awk' END {x = ($ 2 + $ 8); if ($ x <10) echo "((f ++)); "else echo" ((s ++)) "} '" $ ii/$ jj/$ kk/out.dat ")" ' – anishsane

ответ

0

вот пример передачи переменных из bash в awk и обратно:

result=$(awk -v f=$f -v s=$s ' 
    END{x=($2+$8); 
    if($x<10) ((f++)); 
    else ((s++)); 
    printf "%d\t%d\n", $f,$s 
}' $ii/$jj/$kk/out.dat) 
f=$(echo "$result" | cut -f1) 
s=$(echo "$result" | cut -f2) 
+0

Будьте осторожны: символ трубы, вероятно, означает, что вся партия выполняется в подклассе, а значения, считанные в 'f' и' s', тогда недоступны в основной оболочке. Есть способы обойти это (замена процесса, 'shopt -s lastpipe' и т. Д.). –

+0

, это правда. "исправлено". – webb

+0

спасибо. Это очень четкая демонстрация для передачи значений между «bash» и «awk». – Simon

0

здесь более простой вариант:

x=$(tail -n1 $ii/$jj/$kk/out.dat | awk '{print $2+$8}') 
[ "0$x" -lt 10 ] && f=$(expr $f + 1) || s=$(expr $s + 1) 

объяснение:

  1. получить последнюю строку это out.dat, добавьте поля 2 & 8, сохраните результат в x.
  2. если х < 10, приращение F, в противном случае процесс приращения сек
+0

Спасибо за ваше решение! Но если вы объясните ["0 $ x" -lt 10]? Я пытаюсь узнать, как это работает. – Simon

+0

это традиционный способ обработки вероятности того, что $ x может = "" иногда. в этом случае '[$ x -lt 10]' или '[" $ x "-lt 10]' будут вызывать ошибку, тогда как '' 0 $ x "' оценивается как 0, поэтому нет ошибки. – webb

+1

Если я правильно понимаю, когда '$ x = 10',' "0 $ x" = 010', который все еще работает. На всякий случай '$ x = пустое пространство' Спасибо! – Simon

Смежные вопросы