【问题标题】:Optimising a sed grep regex shell script优化 sed grep 正则表达式 shell 脚本
【发布时间】:2019-11-23 12:20:27
【问题描述】:

我已经设法创建了一个工作 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

感谢您的任何建议,请尽可能明确地提出建议(最好是代码建议),因为我对此很陌生。再次感谢!

【问题讨论】:

  • 您可以为显示的输入文件添加您的(预期)输出吗?这比阅读脚本更容易理解你在做什么。
  • 我投票结束这个问题,因为这个问题属于CodeReview SE
  • @Socowi 添加了它。 Oguz Ismail:啊,不知道 CodeReview SE 的存在......
  • 不幸的是,你应该重新开始编写一个 awk(或者我猜是因为你已经调用了 python)脚本而不是 shell 脚本,因为这对于 shell 脚本来说是一个完全不合适的应用程序,这就是它如此缓慢的原因和越野车。见why-is-using-a-shell-loop-to-process-text-considered-bad-practice
  • 同意 Ed Morton 的观点。使用正确的工具! Perl、Python 或 JQ

标签: regex bash shell sed grep


【解决方案1】:

我可以在这里给你一个起点,这是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

【讨论】:

    【解决方案2】:

    您需要澄清问题 - 示例输出与输入不匹配。但是,基于一些假设,使用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)解析会容易得多。

    【讨论】:

    • 你好——这似乎排除了当其余 api 无法识别输入的有效引理时的单词——在这种情况下,所需的输出只是让输入保持原样。见第一行的例子——“Szekó_József”。这就是 if 在我的代码中所做的。
    • @user3616457 用匈牙利语输入/输出逆向工程(未注释)代码并不容易。考虑对原始问题发布清晰、完整的要求。
    • 或者只是修改建议的解决方案以添加缺失的行为。
    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2013-06-12
    • 2019-03-27
    • 2018-11-27
    相关资源
    最近更新 更多