簡體   English   中英

優化sed grep regex shell腳本

[英]Optimising a sed grep regex shell script

我設法創建了一個工作的shell腳本(OS X),該腳本似乎可以完成我想要的工作(以前很少或幾乎沒有shell經驗)。 但是,即使它似乎起作用,它的運行速度也相當緩慢-所以我想知道是否有任何明顯的調整可以優化性能。

因此,基本上,代碼的作用是將文件通過python腳本傳遞給REST API,然后解析結果文本(從中獲取“引理”,並將它們組裝成連續的字符串)。

我們從REST API中獲得的文本如下所示:

filename
form wsafter anas
Szekó_József " " []
fideszes " " [{"lemma": "fideszes", "tag": "[/Adj][Nom]", "morphana": "Fidesz[/N]=fidesz+es[_Adjz:s/Adj]=es+[Nom]=", "readable": "Fidesz[/N]=fidesz + es[_Adjz:s/Adj] + [Nom]", "twolevel": "f:F i:i d:d e:e s:s z:z :[/N] e:e s:s :[_Adjz:s/Adj] :[Nom]"}, {"lemma": "fideszes", "tag": "[/N][Nom]", "morphana": "Fidesz[/N]=fidesz+es[_Nz:s/N]=es+[Nom]=", "readable": "Fidesz[/N]=fidesz + es[_Nz:s/N] + [Nom]", "twolevel": "f:F i:i d:d e:e s:s z:z :[/N] e:e s:s :[_Nz:s/N] :[Nom]"}]
polgármester " " [{"lemma": "polgármester", "tag": "[/N][Nom]", "morphana": "polgár[/N]=polgár+mester[/N]=mester+[Nom]=", "readable": "polgár[/N] + mester[/N] + [Nom]", "twolevel": "p:p o:o l:l g:g á:á r:r :[/N] m:m e:e s:s t:t e:e r:r :[/N] :[Nom]"}, {"lemma": "polgármester", "tag": "[/N][Nom]", "morphana": "polgármester[/N]=polgármester+[Nom]=", "readable": "polgármester[/N] + [Nom]", "twolevel": "p:p o:o l:l g:g á:á r:r m:m e:e s:s t:t e:e r:r :[/N] :[Nom]"}]
tragikus " " [{"lemma": "tragikus", "tag": "[/Adj][Nom]", "morphana": "tragikus[/Adj]=tragikus+[Nom]=", "readable": "tragikus[/Adj] + [Nom]", "twolevel": "t:t r:r a:a g:g i:i k:k u:u s:s :[/Adj] :[Nom]"}, {"lemma": "tragikus", "tag": "[/N][Nom]", "morphana": "tragikus[/N]=tragikus+[Nom]=", "readable": "tragikus[/N] + [Nom]", "twolevel": "t:t r:r a:a g:g i:i k:k u:u s:s :[/N] :[Nom]"}]
halála " " [{"lemma": "halál", "tag": "[/N][Poss.3Sg][Nom]", "morphana": "halál[/N]=halál+a[Poss.3Sg]=a+[Nom]=", "readable": "halál[/N] + a[Poss.3Sg] + [Nom]", "twolevel": "h:h a:a l:l á:á l:l :[/N] a:a :[Poss.3Sg] :[Nom]"}]
után " " [{"lemma": "után", "tag": "[/Post]", "morphana": "után[/Post]=után", "readable": "után[/Post]", "twolevel": "u:u t:t á:á n:n :[/Post]"}]
egy " " [{"lemma": "egy", "tag": "[/Det|Art.NDef]", "morphana": "egy[/Det|Art.NDef]=egy", "readable": "egy[/Det|Art.NDef]", "twolevel": "e:e g:g y:y :[/Det|Art.NDef]"}, {"lemma": "egy", "tag": "[/Num][Nom]", "morphana": "egy[/Num]=egy+[Nom]=", "readable": "egy[/Num] + [Nom]", "twolevel": "e:e g:g y:y :[/Num] :[Nom]"}, {"lemma": "egy", "tag": "[/N|Pro][Nom]", "morphana": "egy[/N|Pro]=egy+[Nom]=", "readable": "egy[/N|Pro] + [Nom]", "twolevel": "e:e g:g y:y :[/N|Pro] :[Nom]"}]
polgármester-jelölt " " [{"lemma": "polgármester-jelöl", "tag": "[/V][Pst.NDef.3Sg]", "morphana": "polgár[/N]=polgár+mester[/N]=mester+[Nom]=+-[Hyph:Hyph]=-+jelöl[/V]=jelöl+t[Pst.NDef.3Sg]=t", "readable": "polgár[/N] + mester[/N] + [Nom] + -[Hyph:Hyph] + jelöl[/V] + t[Pst.NDef.3Sg]", "twolevel": "p:p o:o l:l g:g á:á r:r :[/N] m:m e:e s:s t:t e:e r:r :[/N] :[Nom] -:- :[Hyph:Hyph] j:j e:e l:l ö:ö l:l :[/V] t:t :[Pst.NDef.3Sg]"}, {"lemma": "polgármester-jelölt", "tag": "[/Adj][Nom]", "morphana": "polgár[/N]=polgár+mester[/N]=mester+[Nom]=+-[Hyph:Hyph]=-+jelöl[/V]=jelöl+t[_PerfPtcp/Adj]=t+[Nom]=", "readable": "polgár[/N] + mester[/N] + [Nom] + -[Hyph:Hyph] + jelöl[/V] + t[_PerfPtcp/Adj] + [Nom]", "twolevel": "p:p o:o l:l g:g á:á r:r :[/N] m:m e:e s:s t:t e:e r:r :[/N] :[Nom] -:- :[Hyph:Hyph] j:j e:e l:l ö:ö l:l :[/V] t:t :[_PerfPtcp/Adj] :[Nom]"}, {"lemma": "polgármester-jelölt", "tag": "[/N][Nom]", "morphana": "polgár[/N]=polgár+mester[/N]=mester+[Nom]=+-[Hyph:Hyph]=-+jelölt[/N]=jelölt+[Nom]=", "readable": "polgár[/N] + mester[/N] + [Nom] + -[Hyph:Hyph] + jelölt[/N] + [Nom]", "twolevel": "p:p o:o l:l g:g á:á r:r :[/N] m:m e:e s:s t:t e:e r:r :[/N] :[Nom] -:- :[Hyph:Hyph] j:j e:e l:l ö:ö l:l t:t :[/N] :[Nom]"}, {"lemma": "polgármester-jelöl", "tag": "[/V][Pst.NDef.3Sg]", "morphana": "polgármester[/N]=polgármester+[Nom]=+-[Hyph:Hyph]=-+jelöl[/V]=jelöl+t[Pst.NDef.3Sg]=t", "readable": "polgármester[/N] + [Nom] + -[Hyph:Hyph] + jelöl[/V] + t[Pst.NDef.3Sg]", "twolevel": "p:p o:o l:l g:g á:á r:r m:m e:e s:s t:t e:e r:r :[/N] :[Nom] -:- :[Hyph:Hyph] j:j e:e l:l ö:ö l:l :[/V] t:t :[Pst.NDef.3Sg]"}, {"lemma": "polgármester-jelölt", "tag": "[/Adj][Nom]", "morphana": "polgármester[/N]=polgármester+[Nom]=+-[Hyph:Hyph]=-+jelöl[/V]=jelöl+t[_PerfPtcp/Adj]=t+[Nom]=", "readable": "polgármester[/N] + [Nom] + -[Hyph:Hyph] + jelöl[/V] + t[_PerfPtcp/Adj] + [Nom]", "twolevel": "p:p o:o l:l g:g á:á r:r m:m e:e s:s t:t e:e r:r :[/N] :[Nom] -:- :[Hyph:Hyph] j:j e:e l:l ö:ö l:l :[/V] t:t :[_PerfPtcp/Adj] :[Nom]"}, {"lemma": "polgármester-jelölt", "tag": "[/N][Nom]", "morphana": "polgármester[/N]=polgármester+[Nom]=+-[Hyph:Hyph]=-+jelölt[/N]=jelölt+[Nom]=", "readable": "polgármester[/N] + [Nom] + -[Hyph:Hyph] + jelölt[/N] + [Nom]", "twolevel": "p:p o:o l:l g:g á:á r:r m:m e:e s:s t:t e:e r:r :[/N] :[Nom] -:- :[Hyph:Hyph] j:j e:e l:l ö:ö l:l t:t :[/N] :[Nom]"}]
maradt " " [{"lemma": "marad", "tag": "[/V][Pst.NDef.3Sg]", "morphana": "marad[/V]=marad+t[Pst.NDef.3Sg]=t", "readable": "marad[/V] + t[Pst.NDef.3Sg]", "twolevel": "m:m a:a r:r a:a d:d :[/V] t:t :[Pst.NDef.3Sg]"}, {"lemma": "maradt", "tag": "[/Adj][Nom]", "morphana": "marad[/V]=marad+t[_PerfPtcp/Adj]=t+[Nom]=", "readable": "marad[/V] + t[_PerfPtcp/Adj] + [Nom]", "twolevel": "m:m a:a r:r a:a d:d :[/V] t:t :[_PerfPtcp/Adj] :[Nom]"}]
a " " [{"lemma": "a", "tag": "[/Det|Art.Def]", "morphana": "a[/Det|Art.Def]=a", "readable": "a[/Det|Art.Def]", "twolevel": "a:a :[/Det|Art.Def]"}, {"lemma": "a", "tag": "[/Det|Pro|(Post)]", "morphana": "a[/Det|Pro|(Post)]=a", "readable": "a[/Det|Pro|(Post)]", "twolevel": "a:a :[/Det|Pro|(Post)]"}, {"lemma": "a", "tag": "[/N][Nom]", "morphana": "a[/N|Ltr]=a+[Nom]=", "readable": "a[/N|Ltr] + [Nom]", "twolevel": "a:a :[/N|Ltr] :[Nom]"}, {"lemma": "a", "tag": "[/N|Pro|(Post)][Nom]", "morphana": "a[/N|Pro|(Post)]=a+[Nom]=", "readable": "a[/N|Pro|(Post)] + [Nom]", "twolevel": "a:a :[/N|Pro|(Post)] :[Nom]"}]
Baranya " " [{"lemma": "Baranya", "tag": "[/N][Nom]", "morphana": "Baranya[/N]=Baranya+[Nom]=", "readable": "Baranya[/N] + [Nom]", "twolevel": "B:B a:a r:r a:a n:n y:y a:a :[/N] :[Nom]"}]
megyei " " [{"lemma": "megyei", "tag": "[/Adj][Nom]", "morphana": "megye[/N]=megye+i[_Adjz:i/Adj]=i+[Nom]=", "readable": "megye[/N] + i[_Adjz:i/Adj] + [Nom]", "twolevel": "m:m e:e g:g y:y e:e :[/N] i:i :[_Adjz:i/Adj] :[Nom]"}, {"lemma": "megyei", "tag": "[/Adj][Nom]", "morphana": "megyei[/Adj]=megyei+[Nom]=", "readable": "megyei[/Adj] + [Nom]", "twolevel": "m:m e:e g:g y:y e:e i:i :[/Adj] :[Nom]"}]
településen "" [{"lemma": "település", "tag": "[/N][Supe]", "morphana": "telep[/N]=telep+ül[/V]=ül+és[_Ger/N]=és+en[Supe]=en", "readable": "telep[/N] + ül[/V] + és[_Ger/N] + en[Supe]", "twolevel": "t:t e:e l:l e:e p:p :[/N] ü:ü l:l :[/V] é:é s:s :[_Ger/N] e:e n:n :[Supe]"}, {"lemma": "település", "tag": "[/N][Supe]", "morphana": "telep[/N]=telep+ülés[/N]=ülés+en[Supe]=en", "readable": "telep[/N] + ülés[/N] + en[Supe]", "twolevel": "t:t e:e l:l e:e p:p :[/N] ü:ü l:l é:é s:s :[/N] e:e n:n :[Supe]"}, {"lemma": "település", "tag": "[/N][Supe]", "morphana": "települ[/V]=települ+és[_Ger/N]=és+en[Supe]=en", "readable": "települ[/V] + és[_Ger/N] + en[Supe]", "twolevel": "t:t e:e l:l e:e p:p ü:ü l:l :[/V] é:é s:s :[_Ger/N] e:e n:n :[Supe]"}, {"lemma": "település", "tag": "[/N][Supe]", "morphana": "település[/N]=település+en[Supe]=en", "readable": "település[/N] + en[Supe]", "twolevel": "t:t e:e l:l e:e p:p ü:ü l:l é:é s:s :[/N] e:e n:n :[Supe]"}]
, " " [{"lemma": ",", "tag": "[Punct]", "morphana": "", "readable": "", "twolevel": ""}]
a " " [{"lemma": "a", "tag": "[/Det|Art.Def]", "morphana": "a[/Det|Art.Def]=a", "readable": "a[/Det|Art.Def]", "twolevel": "a:a :[/Det|Art.Def]"}, {"lemma": "a", "tag": "[/Det|Pro|(Post)]", "morphana": "a[/Det|Pro|(Post)]=a", "readable": "a[/Det|Pro|(Post)]", "twolevel": "a:a :[/Det|Pro|(Post)]"}, {"lemma": "a", "tag": "[/N][Nom]", "morphana": "a[/N|Ltr]=a+[Nom]=", "readable": "a[/N|Ltr] + [Nom]", "twolevel": "a:a :[/N|Ltr] :[Nom]"}, {"lemma": "a", "tag": "[/N|Pro|(Post)][Nom]", "morphana": "a[/N|Pro|(Post)]=a+[Nom]=", "readable": "a[/N|Pro|(Post)] + [Nom]", "twolevel": "a:a :[/N|Pro|(Post)] :[Nom]"}]
szocialista " " [{"lemma": "szocialista", "tag": "[/Adj][Nom]", "morphana": "szocialista[/Adj]=szocialista+[Nom]=", "readable": "szocialista[/Adj] + [Nom]", "twolevel": "s:s z:z o:o c:c i:i a:a l:l i:i s:s t:t a:a :[/Adj] :[Nom]"}, {"lemma": "szocialista", "tag": "[/N][Nom]", "morphana": "szocialista[/N]=szocialista+[Nom]=", "readable": "szocialista[/N] + [Nom]", "twolevel": "s:s z:z o:o c:c i:i a:a l:l i:i s:s t:t a:a :[/N] :[Nom]"}]
Csorbai_Ferenc "" []
, " " [{"lemma": ",", "tag": "[Punct]", "morphana": "", "readable": "", "twolevel": ""}]
( "" [{"lemma": "(", "tag": "[Punct]", "morphana": "", "readable": "", "twolevel": ""}]

預期結果:

Szekó_József fideszes polgármester tragikus halál után egy polgármester-jelöl marad a Baranya megyei település , a szocialista Csorbai_Ferenc , ( 

這是腳本本身:

#! /bin/bash

CV=1
for file in /Users/balintkis/tdk/budapest-onk-valasztas/bigramizalt-nev-support/*
do
    echo $file
    tempfilename="/Users/balintkis/tdk/budapest-onk-valasztas/bigramizalt-nev-support-result/temp$CV.txt"

    szoveg=$(python3 docker-py.py $file) 

    echo "$szoveg" >> $tempfilename
    sed -E -i "" "1,2d" $tempfilename
    sed -i "" '/^[[:space:]]*$/d' $tempfilename

    while IFS= read -r line
    do
        lemmacount=$(echo "$line" | egrep -c '\[{\"lemma\": \".*?\"')
        if [ "$lemmacount" -ge "1" ]
        then
            sp0=$(echo "$line" | egrep -o '\[{\"lemma\": \".*?\"')
            sp=${sp0:12}
            sp=${sp%?}
            sp=$sp" "
            echo -n "$sp" >> /Users/balintkis/tdk/budapest-onk-valasztas/bigramizalt-nev-support-result/kiir$CV.txt
        else
            sp=$(echo "$line" | sed -E 's|.*\[\](.*)\[\/.*|\1|g')
            sp=$(echo $sp | sed -E 's|\s*(.*)\s*|\1|g')
            echo -n "$sp " >> /Users/balintkis/tdk/budapest-onk-valasztas/bigramizalt-nev-support-result/kiir$CV.txt
       fi
    done < "$tempfilename"

    rm $tempfilename
    CV=$((CV+1))
done

感謝您的任何建議,請盡可能明確地建議(理想情況下使用代碼建議),因為我對此很陌生。 再次感謝!

我可以在這里給您一個起點,它是grep的基本用法:

假設您有一個文件,看起來像這樣:

info1
info2
blabla
info3
more blabla

您想對所有包含info

您似乎在執行以下操作(偽代碼):

while readline(<filename>)
do
  use "grep" to see if the word "info" is on that line. In that case, do something
done

可以這樣簡單地完成此操作( grep自動檢查文件中的每一行):

grep "info" <filename> | do something

您需要澄清問題-示例輸出與輸入不匹配。 但是,基於一些假設,使用awk過濾/ JQ解析JSON

cat resp.txt |
    awk 'BEGIN { print "[" } END { print "[] ]" } /lemma/ { sub("^[^[]*. ", ""); print $0, "," }' | 
    jq '.[][].lemma' |
    uniq |
    tr -d '"' |
    tr '\n' ' '

結果如下所示。 您應該能夠合並它們

fideszes polgármester tragikus halál után egy polgármester-jelöl polgármester-jelölt polgármester-jelöl polgármester-jelölt marad

需要awk從響應中提取JSON。 jq提取引理。

考慮將輸出文件更改為僅JSON。 使用單個工具(jq)解析它會容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM