计算来自不同文件的3种定界符(逗号,分号,竖线)

时间:2019-03-01 10:10:27

标签: linux shell perl unix sed

我正在尝试开发类似的东西。但是我的要求有点不同。我想计算第一行和第二行中定界符的数量。如果两行的分隔符都匹配,则可以,否则文件需要移动到拒绝文件夹。下面是脚本。但是在这里我有一个问题,我如何计算不同文件中的3个不同的分隔符。例如,我有逗号,分号和竖线分隔符。在下面的sed命令脚本中,如何同时检查三种定界符?

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 :(得分:2)

如果分隔符都不是前两行的一部分,则可以使用以下通用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 ...

这将输出计数不匹配的所有文件。

答案 1 :(得分:0)

我刚刚创建了一个文件,其中仅包含逗号,分号和竖线字符:

> [1, 2] == true
< false

然后我运行以下命令:

> [1, 2] == false
< false

结果是12,正如预期的那样。

答案 2 :(得分:0)

我发现以下内容同时包含所有定界符。请检查是否正确。

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

答案 3 :(得分:0)

您可以通过将定界符移动到新行来计数,用';'代替,然后对它们进行计数:

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

当您只想知道具有相同编号的数字时,就无需计数。
删除所有其他字符,并用点替换所有剩余的字符。

if [[ $(sed '1s/[^|,;]//g;s/././g' ${findresult}) != 
      $(sed '2s/[^|,;]//g;s/././g' ${findresult}) ]]; then

答案 4 :(得分:0)

在bash shell类型上

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
}