Обработка файла с разделителями табуляции с помощью обработки сценария оболочки - PullRequest
2 голосов
/ 06 мая 2010

обычно я бы использовал Python / Perl для этой процедуры, но я (по политическим соображениям) вынужден выполнить это с помощью оболочки bash.

У меня есть большой файл с разделителями табуляции, который содержит шесть столбцов, а второй столбец - целые числа. Мне нужно написать сценарий для решения, которое проверило бы, что файл действительно состоит из шести столбцов и что второй столбец действительно является целым числом. Я предполагаю, что мне нужно было бы использовать sed / awk где-то здесь. Проблема в том, что я не очень знаком с sed / awk. Любой совет будет оценен.

Большое спасибо! Лилли

Ответы [ 4 ]

3 голосов
/ 06 мая 2010

простак:

BEGIN {
  FS="\t"
}

(NF != 6) || ($2 != int($2)) {
  exit 1
}

Вызвать следующим образом:

if awk -f colcheck.awk somefile
then
  # is valid
else
  # is not valid
fi
2 голосов
/ 07 мая 2010

Pure Bash:

infile='column6.dat'
lno=0

while read -a line ; do
  ((lno++))
  if [ ${#line[@]} -ne 6 ] ; then
    echo -e "line $lno has ${#line[@]} elements"
  fi
  if ! [[  ${line[1]} =~ ^[0-9]+$ ]] ; then
    echo -e "line $lno column  2 : not an integer"
  fi
done < "$infile"

Возможный вывод:

line 19 has 5 elements
line 36 column  2 : not an integer
line 38 column  2 : not an integer
line 51 has 3 elements
2 голосов
/ 06 мая 2010

вот как это сделать с помощью awk

awk 'NF!=6||$2+0!=$2{print "error"}' file
2 голосов
/ 06 мая 2010

Ну, вы можете напрямую сказать awk, что такое разделитель полей (опция -F). Внутри awk скрипта вы можете указать, сколько полей присутствует в каждой записи с помощью переменной NF.

О, и вы можете проверить второе поле с помощью регулярного выражения. Все это может выглядеть примерно так:

awk < thefile -F\\t '
{ if (NF != 6 || $2 ~ /[^0123456789]/) print "Format error, line " NR; }
'

Это, вероятно, близко, но мне нужно проверить регулярное выражение, потому что изменение синтаксиса регулярного выражения в Linux настолько безумно. ( отредактировано, потому что grrrr )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...