根据字符/单词比率从文件中删除行 - unix / bash

时间:2014-08-18 04:47:46

标签: python unix count word-count charactercount

我有两个文件,我需要删除属于某个令牌比率的行,例如

文件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()])

2 个答案:

答案 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并查看关于关系表达式的部分。这应该允许您对比率的任何阈值进行比较。