基于字符/字比从文件中删除行- unix/bash



我有两个文件,我需要删除符合特定标记比例的行,例如

文件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,看看关于关系表达式的部分。这应该允许你做比较,无论你的阈值为比率

相关内容

  • 没有找到相关文章

最新更新