Bash

輸出前一個管道結果的 bash 命令

  • October 14, 2015

我有一個從 WebSpider 輸出的文本文件。Spider 從給定的 URL 列表中提取所有句子。然後我需要做的是處理這個文件並找到包含超過 65 個字元的所有行,然後確定每行的語言。我已經讓它在一個班輪中工作(我的 bash 腳本技能不存在)。

sed -n '/^.\{65\}/p' www.mbl.is | langid --line | grep is

langid 是一個 python 模組,用於辨識語言並提供與該語言的可能性相關的數字。要安裝只需執行:

pip install langid

或訪問https://github.com/saffsd/langid.py,了解更多資訊。現在我需要做的是列印通過管道傳輸到 langid 命令中的行,其中包含“is”,因此是 grep。以下是我目前命令的範例輸出:

('is', -288.34235095977783)
('is', -168.52833652496338)
('is', -255.30311250686646)
('is', -254.8700122833252)
('is', -664.7349543571472)
('is', -169.40936374664307)
('is', -315.0590629577637)
('is', -323.49001693725586)
('is', -281.2222490310669)
('is', -198.52733993530273)
('is', -152.1551775932312)
('is', -66.93532514572144)
('is', -231.61306524276733)
('is', -254.00042057037354)
('is', -322.7330708503723)
('is', -151.84487915039062)

編輯:根據terdon♦評論

命令:

sed -n '/^.\{65\}/p' www.mbl.is

輸出:

Eftir stutt stopp i hofudborginni sem okkur heilt yfir leist agaetlega a var kominn timi a ad graeja visa fyrir Vietnam.    1
I gaer, paskadag, eyddum vid thvi deginum i ad koma okkur fyrir a Back Home, gerdum god kaup a Petaling Street (chinatown) og forum i paskaeggjaleit.   1
Vid, temmilega nyvoknud, stigum ut ur rutunni thar sem klassisku leigubilstjornarnir standa fyrir utan ad berjast um folk i bilana sina.    1
Vid forum med Boraj og Tino og leigdum okkur hljodeinangrad einkaherbergi med ollu innifoldu i klukkutima, fyrir taepa 20 dollara (1/4 af manadarlaunum theirra!) - fullt af bjor, starfsmadur med okkur allan timan og steiktar poddur i snakk med idyfum. 1
Vid ludarnir i "Good morning Vietnam" bolunum okkar umkringd moldriku folki klaett i italkst fra toppi og nidur.    1
Vid aetlum tho rett ad vona ad foreldrar okkar sjai ser faert ad geyma eins og eitt alvoru paskaegg handa hvoru okkar?  1
Hinsvegar var okkur bent a tyndu perluna, Mai Chau, sem hefur allt sem Sapa hefur upp a ad bjoda, nema thu dregur turismann fra.    1
Thetta var audvitad allt saman hreinasta lygi en vid letum okkur hafa thad og gistum eina nott a thessu annars agaeta hoteli.   1
Individual truth is constantly evolving, and a truth seeker must be willing to give up last week's major truth for whatever new discovery the innermost self reveals.   1
Um kvoldid forum vid svo oll saman ad borda vid mekong ana og attum mjog gott kvold saman.  1
Tha segja teir enn fremur ad bandarikjamenn hafi i raun verid ad reyna ad hindra frekari utbreidslu kommunisma i SA-Asiu, svo ad stridid var i raun bara einn stor misskilningur.   1

命令:

sed -n '/^.\{65\}/p' www.mbl.is | langid --line

輸出:

('en', -193.52840971946716)
('en', -445.4644522666931)
('en', -158.1918339729309)
('en', -220.16202330589294)
('en', -596.61936211586)
('en', -379.3824007511139)
('en', -150.61454391479492)
('en', -379.3824007511139)
('en', -270.56594038009644)
('en', -446.9800910949707)
('en', -702.9869554042816)
('en', -208.84209847450256)
('en', -345.15056800842285)
('en', -321.2763195037842)
('en', -209.9769265651703)
('en', -144.31591272354126)
('en', -208.40711855888367)
('en', -161.14595460891724)
('en', -180.95807218551636)
('is', -151.84487915039062)
('en', -32.042465686798096)
('no', -73.23809719085693)
('lb', -194.81272649765015)
('et', -80.76274251937866)
('en', -129.17673206329346)
('en', -95.43238878250122)
('da', -30.086124420166016)

這是否可以在一個班輪中完成,或者最好編寫一個腳本。我可以在 python 中做到這一點,但它的正則表達式模組很痛苦,需要根據輸入文件快速更改字元變數,並將 grep 輕鬆更改為不同的語言程式碼。另外,我認為這是開始我的 bash 腳本之旅的好時機,bash 命令很棒,我可以假設 bash 腳本也是如此(我只需要了解語義和語法,很多 $標誌)

你可以用一個while循環來做到這一點:

while read l; do
 [ ${#l} -gt 65 ] && \
   echo "$l" | langid --line | grep -q "is" && \
   echo "$l"
done <file

  • read l逐行讀取輸入並將目前行儲存在變數中$l

  • [ ${#l} -gt 65 ]如果該行包含超過 65 個字元。

    • echo "$l" | langid --line | grep -q "is"處理線路和grep語言,注意用-qgrep將保持沉默。我們只想檢查字元串是否存在,沒有輸出。
    • echo "$l"如果字元串在那裡,則列印原始行。
  • <file使用的內容file作為輸入。


編輯:上面langid在每一行上執行命令,這很慢。如果您希望它在一次運輸中執行(更快),請使用:

awk 'FNR==NR{a[NR]=$0}
 FNR!=NR&&$1~"is"{print a[FNR]}' \
<(sed -n '/^.\{65\}/p' file) \
<(sed -n '/^.\{65\}/p' file | langid --line)
  • awk處理兩個“文件”:

    • 的輸出sed -n '/^.\{65\}/p' file:包含 65 個或更多字元的所有句子。
    • 其輸出sed -n '/^.\{65\}/p' file | langid --line在一次傳輸中處理所有包含 65 個或更多字元的行。
  • 內部awk

    • FNR==NR適用於第一個“文件”
    • a[NR]=$0用行號作為索引填充數組
    • FNR!=NR&&$1~"is"適用於第二個“文件”並檢查該行是否包含字元串is
    • print a[FNR]``a如果那是真的,在包含原始句子的先前創建的數組中列印相應的行。

引用自:https://unix.stackexchange.com/questions/236064