前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >shell 对 PDF 转 txt 后自动查找内容

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

原创
作者头像
eisc
修改2024-04-25 16:35:11
1240
修改2024-04-25 16:35:11
举报
文章被收录于专栏:linux 自动化运维
代码语言: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 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档