Подсчитайте 3 типа разделителей (запятая, точка с запятой, труба) из разных файлов - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь развить подобное.Но мое требование немного отличается.Я хотел бы посчитать количество разделителей в 1-м ряду и во 2-м ряду.Если разделители в обеих строках совпадают, хорошо, в противном случае файл необходимо переместить в папку отклонения.Ниже приведен сценарий.Но здесь у меня вопрос, как мне рассчитывать на 3 разных разделителя в разных файлах.Для примера у меня есть запятая, точка с запятой и разделитель.В приведенном ниже сценарии в команде sed, как проверить одновременно 3 типа разделителей?

pathname=/opt/interfaces/sample_check/mvfiles/inbox

findresult=$(find $pathname -type f ( -name "messagemulti.csv" -or -name "messagesemi.txt" -or -name "comma2.txt" -or -name "messagepipe.txt" -or -name "tokkalodi.txt" -or -name "ADMC_POSITION-LT3213.csv" -or -name "DMC_CASHFLOW248.csv" -or -name "ADMC_EQBASKET-WEIGHTS_52387.csv" -or -name "ADMC_POSITION-DDD7.csv" -or -name "ADMC_POSITION-DDD7.csv" ))

Count=sed -n 1p $findresult | tr ',' '\n' | wc -l
Count2=sed -n 2p $findresult | tr ',' '\n' | wc -l

echo $Count echo $Count2

if [ $Count != $Count2 ]
then echo "Mis Match"
  mv $findresult /opt/interfaces/sample_check/mvfiles/reject
else echo "Match"
  exit
fi

Ответы [ 5 ]

0 голосов
/ 08 апреля 2019

на оболочке типа bash

i=
pathname=/opt/interfaces/sample_check/mvfiles/inbox
for file in messagemulti.csv messagesemi.txt comma2.txt messagepipe.txt tokkalodi.txt ADMC_POSITION-LT3213.csv DMC_CASHFLOW248.csv ADMC_EQBASKET-WEIGHTS_52387.csv ADMC_POSITION-DDD7.csv ADMC_POSITION-DDD7.csv
{
while read -r l ;do s=${l//[!,;\|]}; c=${#s}; ((++i==1))&&d=$c; if((i==2));then ((d==c)) ||mv -v $file $pathname/$file ;fi ;done<$file
}
0 голосов
/ 02 марта 2019

Вы можете сосчитать разделители, переместив их в новую строку, заменив на ';' и сосчитав их:

sed '2 s/[|,;]/\n;/g' ${findresult} | grep -c ';'

Если вы хотите знать только те, которые имеют одинаковое число, вы ненужно их посчитать.
Удалить все остальные символы и заменить все оставшиеся символы точкой.

if [[ $(sed '1s/[^|,;]//g;s/././g' ${findresult}) != 
      $(sed '2s/[^|,;]//g;s/././g' ${findresult}) ]]; then
0 голосов
/ 01 марта 2019

Если ни один из разделителей не является частью двух первых строк, вы можете использовать этот общий сценарий GNU awk:

parse.awk

BEGIN  { FS="[,;|]" }            # Set Field Separators
FNR==1 { count = NF }            # Remember Number of Fields from the first line
FNR==2 { 
  if(count != NF)                # If second line has the same number of fields
    print "Mismatch: " FILENAME  # Report the mismatched file
  nextfile                       # Skip to next input file
}

Запустите его так:

awk -f parse.awk infile1 infile2 ...

Это приведет к выводу любых файлов с несовпадением счетчиков.

0 голосов
/ 01 марта 2019

Я нашел что-то ниже, чтобы включить все разделители одновременно.Пожалуйста, проверьте, правильно ли это.

pathname=/opt/interfaces/sample_check/mvfiles/inbox

findresult=$(find $pathname -type f ( -name "messagemulti.csv" -or -name "messagesemi.txt" -or -name "comma2.txt" -or -name "messagepipe.txt" -or -name "tokkalodi.txt" -or -name "ADMC_POSITION-LT3213.csv" -or -name "DMC_CASHFLOW248.csv" -or -name "ADMC_EQBASKET-WEIGHTS_52387.csv" -or -name "ADMC_POSITION-DDD7.csv" -or -name "ADMC_POSITION-DDD7.csv" ))

Count=sed -n 1p $findresult | tr '[,;|]' '\n' | wc -l
Count2=sed -n 2p $findresult | tr '[,;|]' '\n' | wc -l

echo $Count echo $Count2

if [ $Count != $Count2 ]
then echo "Mis Match"
mv $findresult /opt/interfaces/sample_check/mvfiles/reject
else echo "Match"
exit
fi
0 голосов
/ 01 марта 2019

Я только что создал файл, содержащий только запятые, точки с запятой и символы канала:

echo ",,,;;;;|||||" >test.txt

Затем я выполнил следующую команду:

echo $(($(grep -o "," test.txt | wc -l) + $(grep -o ";" test.txt | wc -l) + $(grep -o "|" test.txt | wc -l)))

Результат был 12, как и ожидалось.

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