输入文件($1)

输入文件($1)

我们想要检查这个句子是声明性的还是现在将其存储在declarative.txt文件中,然后将其余句子放入others.txt文件中,然后将行数放在declarative.txt文件末尾。

如果一个句子以句号结尾,则该句子是“陈述性”的。

输入文件($1)

this life is good.
neverthe less.
suppppppppppppppppperb.
the best coders.
everything is good?
are you okay dude?
ma man !!

到目前为止我的代码

#!/bin/sh
while read row
do
x=$row | grep "\.$"
y=$row | grep -v "\.$"
echo $x >> declarative.txt
echo $y >> others .txt
done < $1
cnt=`wc -l declarative.txt`
echo $cnt >> declarative.txt

答案1

要将输入文件中的行分为以点结尾的行和不以点结尾的行,假设每行只有一个句子,并将它们保存在两个不同的输出文件中,您可以使用grep两次,如下所示:

grep    '\.$' "$1" >declarative.txt
grep -v '\.$' "$1" >others.txt

不需要在 shell 循环中遍历各行(事实上,它灰心丧气)。处理文本文件的 Unix 工具已经内置了循环,因此grep,例如,将依次将正则表达式应用于输入数据的每一行并输出匹配的数据。

您也可以只解析一次输入文件,例如awk

awk '/\.$/ { print >"declarative.txt"; next }
           { print >"others.txt" }' "$1"

declarative.txt如果当前行以点结尾,这将触发将当前行打印到文件的块。将为所有其他线路触发另一个块。

...或与sed

sed -n -e '/\.$/w declarative.txt' \
       -e '//!w others.txt' "$1"

如果当前declarative.txt行以点结尾,则将其写入到;others.txt如果不是,则将其写入。空//表达式的意思是“重新使用最后一个正则表达式”,而!意思是“做如果表达式不匹配”​​。

答案2

这是不是识别陈述句的有效方法。一方面,你的句子都没有以大写字母开头,而且很多甚至根本不是句子。但是,如果您只想将输入文件的行分成两个文件,一个包含以句号结尾的行,另一个包含其余的行,您可以使用awk

awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' file

如果您确实需要将其作为 shell 脚本来执行,您可以简单地使用:

#!/bin/sh
awk '{/\.$/ ? f="fullStop" : f="others"; print > f}' "$1"

如果它必须是一个 shell 循环 (这不是一个好主意), 你可以做:

#!/bin/bash
while IFS= read -r line; do 
    [[ $line =~ \.$ ]] && 
        echo "$line" >> fullStop || 
        echo "$line" >> others
    done < "$1"

或者,如果您无法使用 bash 特定的功能:

#!/bin/sh
while IFS= read -r line; do 
    printf '%s\n' "$line" | grep -q '\.$' && 
    echo "$line" >> fullStop || 
    echo "$line" >> others
done < "$1"

相关内容