Оболочка Bourne: игнорирование определенных видов stdin

с awk, и угадать, что вы хотите

файл ul.awk (отредактирован)

/JOURNEY/ { jn=substr($1,2,1) ; x=substr($1,10,1) ; y=substr($1,13) ;
    printf "JOURNEY_%02d%s; %02d TO %02d\n",jn,substr("                                        ",1,31),x,y ;
    next ; }
 {print ;}

, а затем запустить

awk -f ul.awk u

JOURNEY_01                               ; 00 TO 01
    .BYTE 00, 00, 00
JOURNEY_02                               ; 00 TO 02
    .BYTE 00, 01, 00
JOURNEY_03                               ; 01 TO 00
    .BYTE 00, 01, 01

Это несколько плохое кодирование, поскольку я предполагал, что число всегда будет 1 цифра.

1
25.03.2015, 05:27
1 ответ

Вы можете сделать....

while read line
do    line=${line%%[!0-9]*}
      [ -n "$line" ] || continue
      : work w/ digits at line's head
done

Альтернативно - и, возможно, быстрее - вы можете сделать:

tr -cs 0-9\\n \ |
while IFS=\  read num na
do    ${num:+":"} continue
      : work w/ first seq of digits on line
done

Или, если вы хотите полностью игнорировать любую строку, содержащую что-либо, кроме пробелов, табуляций или чисел, или даже любую строку, содержащую два разделенных пробелами числа....

b=${IFS%?}
grep "^[$b]*[0-9]\{1,\}[$b]*$" |
while read num; do : stuff with "$num"; done

С помощью case вы можете сделать так:

while read num
do    case ${num:--} in 
      *[!0-9]*) continue;;esac
      : something w/ $num
done
0
28.01.2020, 01:42

Теги

Похожие вопросы