我正在尝试开发类似的东西。但是我的要求有点不同。我想计算第一行和第二行中定界符的数量。如果两行的分隔符都匹配,则可以,否则文件需要移动到拒绝文件夹。下面是脚本。但是在这里我有一个问题,我如何计算不同文件中的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
答案 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
}