![bash 命令输出前一个管道的结果](https://linux22.com/image/75071/bash%20%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA%E5%89%8D%E4%B8%80%E4%B8%AA%E7%AE%A1%E9%81%93%E7%9A%84%E7%BB%93%E6%9E%9C.png)
我有一个从 WebSpider 输出的文本文件。蜘蛛从给定的 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)
编辑:根据特登评论
命令:
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 脚本也是如此(我只需要了解语义和语法,很多 $标志)
答案1
您可以使用 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
对于语言,请注意-q
,grep
将保持沉默。我们只是想检查字符串是否存在,没有输出。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
如果是这样,则打印先前创建的包含原始句子的数组中的相应行。
答案2
如果你的 shell 是 bash,你可以这样做:
sed -n '/^.\{65\}/p' www.mbl.is | while read line ; do
LANGID=$(echo "$line" | langid --line)
if [[ "$LANGID" =~ is ]] ; then
echo "$line: $LANGID"
fi
done
但这会非常慢,因为它运行多个实例langid
(每个输入行一个)。您可能最好编写一个导入 langid 的 python 脚本,如 github 上的自述文件中所述。如上所述,一个简单的循环读取 stdin 并将其传递给langid.classify()
就可以了。
我的 python 非常生锈,而且我没有安装 langid.py,所以这是未经测试的,但这是一个非常原始的 python 示例:
#! /usr/bin/python
import langid, fileinput, re
for line in fileinput.input():
if len(line) > 65:
id = langid.classify(line)
if re.match(r'is',id):
print line, ": ", id
它确实通过了编译测试,python -m py_compile langtest.py
但这就是我能说的对它有利的一切。
由霜冻软件添加:
一个经过很大改进并可能经过测试和工作的版本:
#! /usr/bin/python
import sys, codecs, re
from fileinput import input as file
from langid import classify
#Output STDOUT as UTF-8
sys.stdout = codecs.getwriter("utf8")(sys.stdout)
sys.stderr = codecs.getwriter("utf8")(sys.stderr)
#read text as a positional argument and procss each line
for line in file():
#check if line is greater than 65 characters
if len(line) > 65:
#determine the language of each line
id = classify(line)
#check if language is Icelandic
if re.search('is', str(id)):
#print the line and the langid classification
print line, ": ", id
还有一个更全面的 python 脚本,允许参数和一些额外的功能。要点代码