Подсчитать каратэры по столбцу и сумме - PullRequest
0 голосов
/ 28 октября 2018

Цель состоит в том, чтобы проверить, что для входного файла каждый столбец содержит одинаковые цифры.по сравнению с эталонным файлом ..

Я нашел способ проверить, имеет ли формат файла точно такую ​​же структуру (одинаковое копирование по столбцу)

ref_file

1111 2222 333 4

file

1266 2233 344 1
1122 3333 444 1
1111 2222 222 1
1112 2220 22  1
1111 2222 222
1111 2222 222 1

Код, который я пробую.

dd=`awk ' {for(i=1;i<=NF;i++)$i=length($i)}NF' ref_file | awk '{ for(i=1; i<=NF;i++) j+=$i; print j; j=0 }'`

    awk ' {for(i=1;i<=NF;i++)$i=length($i)}NF' file |
      awk '{ for(i=1; i<=NF;i++) j+=$i; print $0" " j; j=0 }' |
       awk '{if($NF!~'$dd')print $0 " error"}' | wc -l | awk '{if($1>0) print "FILE FORMAT WRONG "}'

Я считаю, что есть легкийспособ сделать это.

с моим кодом.Я считаю число для каждого столбца и суммирую каждую строку, если сумма в какой-либо строке не совпадает с общим количеством, то во входном файле есть ошибки.IE, строки 4 и 5. Не обязательно печатать строки с ошибкой.Только если хотя бы одна строка не имеет одинаковую структуру эталонного файла .. покажите сообщение "Неверный формат ФАЙЛА". Что-то в этом роде.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Вот что я придумал (насколько я понял вопрос):

awk 'NR==1{fields=NF
           for (i = 1; i <= fields; i++)
             cols[i]=length($i)
          }
     NR>1 { if(NF != fields)
              print "line "NR" has a different number of columns"
            else
              for (i = 1; i <= NF; i++)
                if(length($i) != cols[i])
                  print "column "i" in line "NR" has a different length"
          }' t

Вывод:

column 3 in line 4 has a different length
line 5 has a different number of columns
0 голосов
/ 28 октября 2018

Аналогично ответу Ф. Кнорра, но использует ref_file

awk '
    NR == FNR { nf = NF; for (i=1; i<=NF; i++) len[i] = length($i); next }
    NF != nf { err = FNR; exit }
    { for (i=1; i<=NF; i++) if (len[i] != length($i)) { err = FNR; exit } }
    END { if (err) { print "invalid file format on line", err; exit 1 } }
' ref_file file

You почти было в вашем комментарии: FILENAME - допустимая переменная awk, которая содержит имя текущего файла (взятого из заданных аргументов команды или «-», если awk читает из стандартного ввода)

END {
    if (err) {print "invalid file format on line", err; exit 1} 
    print "File format correct for :", FILENAME
}
0 голосов
/ 28 октября 2018

Попробуйте это:

awk 'NR == FNR {
  for (i=1; i<=NF; ++i) {
    a[i]=length($i)
  }
  next
}
{
  for (i=1; i<=NF; ++i) {
    if (length($i)!=a[i]) {
      printf("error at line %d, column %d.\n%s\n", FNR, i, $0)
      exit
    }
  }
}' ref_file file

Вывод:

error at line 4, column 3.
1112 2220 22  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...