我有两个文件,我需要删除属于某个令牌比率的行,例如
文件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中的句子用tab分隔:
[OUT]:
This is a foo bar question\tc'est le foo bar question
hello world\tbonjour 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()])
答案 0 :(得分:1)
这是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
答案 1 :(得分:1)
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
并查看关于关系表达式的部分。这应该允许您对比率的任何阈值进行比较。