Проверьте, все ли строки в файле имеют одинаковый формат - PullRequest
1 голос
/ 26 февраля 2020

Я хотел бы написать небольшой скрипт оболочки, позволяющий проверить, все ли строки в файле имеют одинаковое число ;

У меня есть файл, содержащий следующий формат:

$ cat filename.txt

34567890;098765456789;098765567;9876;9876;EXTG;687J;
4567800987987;09876789;9667876YH;9876;098765;098765;09876;
SLKL987H;09876LKJ;POIUYT;PÖIUYT;88765K;POIUYTY;LKJHGFDF;
TYUIO;09876LKJ;POIUYT;LKJHG;88765K;POIUYTY;OIUYT;
...
...
...
SDFGHJK;RTYUIO9876;4567890LKJHGFD;POIUYTRF56789;POIUY;POIUYT;9876;

Я использую следующую команду для определения количества ; каждой строки:

awk -F';' 'NF{print (NF-1)}' filename.txt

У меня есть следующий вывод:

7
7
7
7
...
...
...
7

Потому что число ; в каждой строке этого файла равно 7.

Теперь я хочу написать скрипт, который позволил бы мне проверить, все ли строки в файле имеют 7 запятых. Если все в порядке, он говорит мне, что файл правильный. В противном случае, если в одной строке содержится более 7 запятых, это говорит о том, что файл неверен.

Ответы [ 4 ]

2 голосов
/ 26 февраля 2020

Вместо вывода на печать возвращает значение. например,

awk -F',' 'NR==1{count = NF} NF!=count{status=1}END{exit status}' filename.txt

Если строк нет или все строки содержат одинаковое количество запятых, возвращается 0. В противном случае возвращается 1 для указания ошибки.

0 голосов
/ 27 февраля 2020

На основании всей информации, которую вы мне дали, я закончил тем, что сделал следующее. И это работает для меня.

nbCol=`awk -F';' '(NR==1){print NF;}' $1`
val=7
awk -F';' 'NR==1{count = NF} NF != count { exit 1}' $1
result=`echo $?`

if [ $result -eq 0  ] && [ $nbCol -eq $val ];then
echo "Good Format"
else
echo "Bad Format"
fi
0 голосов
/ 26 февраля 2020

Просто передайте результат через sort -u | wc -l. Если все строки имеют одинаковое количество полей, это приведет к выводу одной строки.

В качестве альтернативы просто найдите строку в awk, в которой количество полей не совпадает с количеством строк в первой строке.

awk -F';' 'NR==1 {linecount=NF}
           linecount != NF { print "Bad line " $0; exit 1}
          ' filename.txt && echo "Good file"

Вы также можете адаптировать старый трюк, используемый для вывода только первой из повторяющихся строк.

awk -F';' '{a[NF]=1}; length(a) > 1 {exit 1}' filename.txt

Каждая строка обновляет количество строк с таким количеством полей. Выход со статусом 1, как только a имеет более одной записи. По сути, a действует как набор всех подсчетов полей, замеченных до сих пор.

0 голосов
/ 26 февраля 2020

Подсчитайте количество уникальных строк и убедитесь, что количество равно 1.

if (($(awk -F';' 'NF{print (NF-1)}' filename.txt | uniq | wc -l) == 1)); then
    echo good
else
    echo bad
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...