shell 对 PDF 转 txt 后自动查找内容

2024-04-25 16:35:11 浏览数 (2)

代码语言:shell复制
#!/bin/bash

sudo chmod 777 ./ ; sudo chmod 777 -R ./*

#shellDir=`pwd`
shellDir="/datadisk/workIng/DongRuan/xuexi/EB_Mcal/文档/shell"
PdfDir="$shellDir/../PDF"
CacheDir=$shellDir/../txt/

GtmTxtDir="$CacheDir/GTM/GtmToAdcDir/source"
AdcTxtDir="$CacheDir/GTM/GtmToAdcDir/AdcDir"

PdfFile=Infineon-AURIX_TC39x-UserManual-v01_00-EN.pdf
PDFtoTxtFile=$PdfDir/Infineon-AURIX_TC39x-UserManual-v01_00-EN.pdf.txt

catNR()
{
    if [[ ! -f $PdfDir/$PdfFile || ! -d $PdfDir ]]
    then 
        echo "请将文件 $PdfFile 放置于脚本同路径下的 PDF 文件夹 "
        sudo mkdir -p  $PdfDir         # 自动递归创建 子目录 
        exit
    fi 

    # 检查文件是否存在
    if [ ! -f "$PDFtoTxtFile" ]; then
        echo "[runing] 正在将pdf 文件转换为 txt 文件: $PDFtoTxtFile  "
        sudo apt install -y poppler-utils
         pdftotext -layout $PdfDir/$PdfFile $PDFtoTxtFile  # 保留原换行格式 进行转换 
        # pdftotext $PdfDir/$PdfFile $PDFtoTxtFile            # 不保留原换行 格式转换 
    fi

    echo "处理文件: $PDFtoTxtFile" 

    Nrlist=(`cat -n $PDFtoTxtFile | grep "GTM_ADCTRIGiOUT" |  awk -F" " '{print $1}'`)
    NameList=(`cat -n $PDFtoTxtFile | grep "GTM_ADCTRIGiOUT" |  awk -F" " '{print $2 $3}' | sed 's/[{}<>()=]/_/g' `)

    NrFinally=(`cat -n $PDFtoTxtFile | grep "GTM to CAN/TTCAN Connections" | grep -vE "26-366|Overview" | awk -F" " '{print $1}'`)

}

CatGrep()
{
    # 检查文件是否存在
    if [ ! -f "$PDFtoTxtFile" ]; then
        echo "文件不存在: $PDFtoTxtFile"
        exit 1
    fi

    awk -v ReadHNR="$ReadHNR" -v ReadLNR="$ReadLNR" -v line_number="$FindNr" 'NR == line_number || (NR > line_number - ReadHNR && NR < line_number   ReadLNR)' "$PDFtoTxtFile" | 
    grep -vwE  '^[0-9]|^[0-9][0-9]'  | sed "/^$/d "
}

CatFile()
{
    
    FileCacheList=(`ls $GtmTxtDir | sed 's/^[[:space:]]*//'  `)
    for((i=0;i<${#FileCacheList[*]};i  ))
    do 
        PDFtoTxtFile=$GtmTxtDir/${FileCacheList[$i]}
        GTMname=`echo ${FileCacheList[$i]} | awk -F"." '{print $1}'`

        Nrlist=(` cat -n $PDFtoTxtFile  | grep SELx | awk -F" " '{print $1}'`)
        NrNameList=(` cat -n $PDFtoTxtFile  | grep SELx |  awk -F" " '{print $2 $3}' | sed "s/ //g" | sed 's/[{}<>()=]/_/g'  `)

        for((adc=0;adc<${#Nrlist[*]};adc  ))
        do
            FindNr=${Nrlist[$adc]} 
            AdcId=${NrNameList[$adc]}

            if [ $adc = $[${#Nrlist[*]}-1] ]
            then
                nextNr=0
                ReadLNR=300
            else
                nextNr=${Nrlist[$adc 1]} 
                ReadLNR=$[$nextNr-$FindNr] 
            fi 

            CatGrep > $AdcTxtDir/$GTMname-$AdcId.txt 
            AdcType=`cat $AdcTxtDir/$GTMname-$AdcId.txt | grep channel | grep used | awk '{print $NF}'`

            cat $AdcTxtDir/$GTMname-$AdcId.txt  | grep -E "[0-9]H|^[A-Z]H" | sed "s/  //g"   > $AdcTxtDir/set_$GTMname-$AdcId.txt   # 重点: 过滤 匹配 行  0~9H 和 A~ZH , 不要进行删除,有跨行的数据
            sudo rm -rf $AdcTxtDir/$GTMname-$AdcId.txt

            sed -i "s/^/$GTMname-$AdcId-$AdcType---/g" $AdcTxtDir/set_$GTMname-$AdcId.txt      # sed 的单引号 不会解析变量 

            echo " PDFtoTxtFile=$PDFtoTxtFilefile  GTMname=$GTMname  AdcId=$AdcId  AdcType=$AdcType  FindNr=$FindNr  nextNr=$nextNr "   
        done 


    done 
}

FindTom()
{
    ADCMaxFlag=0;
    AdcfileList=(`ls $AdcTxtDir`)
    echo "";echo "";
    read -p "请输出 需要触发的ADC的编号 和  TOMx 空格隔开, 为你匹配 TOMx_xx  案例 adc1 TOM3 写 1 TOM3 :  " inputTOMBL

    inputTOMList=($inputTOMBL)              # 变量需要转换为数组 
    FindAdcId=${inputTOMList[0]}
    TOMName=${inputTOMList[1]}

    AdcTypeGrepM="ADCx 8"
    AdcTypeGrepN="ADCx"

    echo "输入的信息为: $FindAdcId  $TOMName   "

    for i in ${AdcfileList[*]}
    do  
        AdcFile=$AdcTxtDir/$i 
        AdcNumberMin=(` echo $i | awk -F"_"  '{print $8}' | awk -F"-" '{print $1}' | sed "s/ //g"`)
        AdcNumberMax=(` echo $i | awk -F"_"  '{print $8}' | awk -F"-" '{print $2}' | sed "s/ //g"`)
        
        if [[ $FindAdcId > 7  ]]
        then
            FindAdcId=$[ FindAdcId - 7 ]
            ADCMaxFlag=1;
            #echo "[8] adc  编号 大于 7 "  
        else 
            if [[ $ADCMaxFlag < 1 ]]
            then 
                ADCMaxFlag=0;
                #echo "[x] adc  编号 小于 7 " 
            fi 
        fi 

        # echo "当前文件 $file 表示的 ADC 范围 最小数: ${AdcNumberMin[*]}  最大数: ${AdcNumberMax[*]}   当前输入触发: ADC $FindAdcId   ADC 类型: $AdcTypeGrep TOM模块 : $TOMName" ; echo ""

        if [[ $FindAdcId -ge $AdcNumberMin && $FindAdcId -le $AdcNumberMax ]]
        then 
            #echo "[ok]  文件中  $file 触发: ADC $FindAdcId   ADC 类型: $AdcTypeGrep TOM模块 : $TOMName "
            #echo " 长度: $AdcTypeGrepLenght 查找到的内容如下: " 
            if [[ $ADCMaxFlag < 1 ]]
            then 
                cat $AdcFile | grep $TOMName | grep  $AdcTypeGrepN | grep -v "$AdcTypeGrepM" 
            else 
                cat $AdcFile | grep $TOMName | grep  $AdcTypeGrepM  
            fi
           # break 
        else
            echo ""
            #echo "当前 ADC ID : $FindAdcId   ADC 类型: $AdcTypeGrep  不在当前文件中,继续往下查找 ..."
        fi 
    done

}

main()
{
    clear 
    read -p "是否清空缓存重新整理文件,回车跳过 y/n: "   ifdel
    if [[ ! -d $GtmTxtDir && ! -d $AdcTxtDir ]]
    then 
        delFalg=1
        echo "当前 缓存文件不存在,因此重新生成缓存..." 
    else 
        delFalg=0
    fi 

    if [[ $ifdel = y || $delFalg = 1 ]]
    then 
        echo "[ok] delect and reset Cache file."    
        sudo rm -rf $GtmTxtDir $AdcTxtDir $PdfDir/*.txt
        sudo mkdir -p $GtmTxtDir $AdcTxtDir $PdfDir
        sudo chmod 777 $GtmTxtDir $AdcTxtDir
    else 
        echo "[exit] not delect Cache file."
    fi 

    catNR
    echo "所有的行号为: " ${Nrlist[*]}
 
    for((i=0;i<${#Nrlist[*]};i  ))
    do
        FindNr=${Nrlist[$i]} 

        ReadHNR=1

        if [ $i = $[${#Nrlist[*]}-1] ]
        then
            nextNr=0
            ReadLNR=$[$NrFinally-$FindNr] 

            echo "Can 结束 行号:  $ReadLNR" ;
        else
            nextNr=${Nrlist[$i 1]} 
            ReadLNR=$[$nextNr-$FindNr] 
        fi 

        echo "FindNr=$FindNr   nextNr=$nextNr  ReadLNR=$ReadLNR  NameList=( ${NameList[*]} )"

        name=${NameList[$i]}

        echo "开始匹配行号: $FindNr"
        CatGrep > $GtmTxtDir/$name.txt    

    done

    CatFile

    FindTom

}
main 

0 人点赞