忽略整个文件中不超过1行的文件

时间:2019-03-11 07:22:00

标签: shell unix awk sed

我遇到以下代码的问题。下面的脚本将计算文件第二行和第三行中的定界符(逗号,竖线或分号)。如果第二行和第三行中的计数不匹配,则文件将移至被拒绝的文件夹。但是问题是,对于某些文件,只有一行,脚本没有前进。如果文件不多于1行,如何在下面的脚本中添加一行以忽略。

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 2p $findresult | tr '[,]' '\n' | tr '[|]' '\n' | tr '[;]' '\n' | wc -l`
Count2=`sed -n 3p $findresult | tr '[,]' '\n' | tr '[|]' '\n' | tr '[;]' '\n' | wc -l`

echo $Count
echo $Count2
    #if the delimiter count from the 2nd line and 3rd line doesnt match the    file will move to the rejected folder
if [ $Count != $Count2 ]

then echo "Mis Match"

 mv $findresult /opt/interfaces/sample_check/mvfiles/reject
else echo "Match"
 exit
fi

3 个答案:

答案 0 :(得分:2)

您的if子句编写不正确,对于整数比较,应使用以下语法:

if [ "$count" -ne "$count2" ]

您还可以在以下位置更改sed/tr命令:

Count=`sed -n '2y/,;|/\n\n\n/;p' $findresult | wc -l`
Count2=`sed -n '3y/,;|/\n\n\n/;p' $findresult | wc -l`

而不是使用那么多管道y命令来进行翻译。

此外,当您要处理一个文件又一个文件时,还需要将所有内容放入一个循环中:

for f in `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" )`
do

 Count=`sed -n '2y/,;|/\n\n\n/;p' "$f" | wc -l`
 Count2=`sed -n '3y/,;|/\n\n\n/;p' "$f" | wc -l`

 echo $Count
 echo $Count2
    #if the delimiter count from the 2nd line and 3rd line doesnt match the    file will move to the rejected folder
 if [ "$Count" -ne "$Count2" ]
 then 
  echo "Mis Match"
  mv "$f" /opt/interfaces/sample_check/mvfiles/reject
 else 
  echo "Match"
 fi
done

答案 1 :(得分:0)

不确定您的完整要求,是否可以使用此find命令更改find​​命令,该命令应提供多于1行的文件。

{{1}}

您可以将其放置在变量中,然后不必检查任何条件,只需在此命令的输出上运行命令即可。

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -nE 's/[^,;|]//g;s/././g;2h;3{G;/^(.*)\n\1$/!q1}' file && 
echo match || (echo mismatch; mv file rejectDir)

从每一行中删除任何不代表换行符的字符,然后将那些左字符转换为句点。比较第二行和第三行的长度,如果它们不同,则以退出代码1退出,否则以退出代码0退出。

使用bash识别前面的退出代码。