我有两个文件,我需要删除符合特定标记比例的行,例如
文件1:This is a foo bar question
that is not a parallel sentence because it's too long
hello world
文件2:c'est le foo bar question
creme bulee
bonjour tout le monde
计算的比率为总no. of words in file 1 / total no. of words in file 2
,低于该比率的句子被删除。
然后输出一个由file1和file2的句子组成的连接文件,用制表符分隔:
[出]:
This is a foo bar questiontc'est le foo bar question
hello worldtbonjour tout le monde
文件的行数总是相同的。我一直在这样做,但如何做同样的unix bash而不是使用python?
# Calculate the ratio.
with io.open('file1', , 'r', encoding='utf8') as f1, io.open('file2', , 'r', encoding='utf8') as f2:
ratio = len(f1.read().split()) / float(len(f2.read().split()))
# Check and output to file.
with io.open('file1', , 'r', encoding='utf8') as f1, io.open('file2', , 'r', encoding='utf8') as f2, io.open('fileout', , 'w', encoding='utf8') as fout:
for l1, l2 in zip(file1, file2):
if len(l1.split())/float(len(l2.split())) > ratio:
print>>fout, "t".join([l1.strip() / l2.strip()])
另外,如果比率计算是基于字符而不是单词,我可以在python中这样做,但是我如何在unix bash中实现相同的?注意,差异只计算len(str.split())
和len(str)
。
# Calculate the ratio.
with io.open('file1', , 'r', encoding='utf8') as f1, io.open('file2', , 'r', encoding='utf8') as f2:
ratio = len(f1.read()) / float(len(f2.read()))
# Check and output to file.
with io.open('file1', , 'r', encoding='utf8') as f1, io.open('file2', , 'r', encoding='utf8') as f2, io.open('fileout', , 'w', encoding='utf8') as fout:
for l1, l2 in zip(file1, file2):
if len(l1)/float(len(l2)) > ratio:
print>>fout, "t".join([l1.strip() / l2.strip()])
这是一个简单的Awk比例计算器。
awk 'NR == FNR { a[NR] = NF; next }
{ print NF/a[FNR] }' file1 file2
这只是打印每行的比率。将其扩展为仅在比率在特定范围内时打印第二个文件是很容易的。
awk 'NR == FNR { a[NR] = NF; next }
NF/a[FNR] >= 0.5 && NF/a[FNR] <= 2' file1 file2
(这使用了Awk的简写——一般形式为condition { action }
,如果省略{ action }
,则默认为{ print }
。类似地,如果省略条件,则无条件执行操作。)
您可以在file1
上运行第二次传递来完成相同的操作,或者只是将文件名倒过来再运行一次。
哦,等等,这里有一个完整的解决方案。
awk 'NR == FNR { a[NR] = NF; w[NR] = $0; next }
NF/a[FNR] >= 0.5 && NF/a[FNR] <= 2 { print w[FNR] "t" $0 }' file1 file2
tripleee关于bash不适用于非整数的评论是正确的,但是如果您真的想使用bash,这应该是您的入门指南。你可以用程序wc
和-w
参数来做。它会计算单词。BC在其他事情中浮动除法
while read line1 <&3 && read line2 <&4; do
line1_count=`echo $line1 | wc -w`
line2_count=`echo $line2 | wc -w`
ratio=`echo "$line1_count / $line2_count" | bc -l`
echo $ratio
done 3<file1 4<file2
还有,man bc
,看看关于关系表达式的部分。这应该允许你做比较,无论你的阈值为比率