我将135个文档存储为135行(因此每行都是一个长文本),而我在File_B中有15个短语。我需要从File_A中提取一个句子及其前面的短语,并在File_B中找到匹配的短语。从File_A-Line_1中提取的句子应输出到新文件File_1中。同样,从File_A-Line_2中提取的句子应输出到新文件File_2等等,直到我从所有行中提取出匹配的句子。
i=1
while read line; do
while read row; do
cat "$line" | sed 's/\./.\n/g' | grep -i -B 1 "$row" | tr -d '\n' | sed 's/--/\n/g' >> file_$i
done < $2
$i = $i+1;
done < $1
这里的问题是,输出被打印到控制台上,但没有打印到新文件中。有人能帮助我认识到我的错误吗?
谢谢你
5条答案
按热度按时间ibps3vxo1#
这是清楚的吗?如果不,评论它,我会编辑它。Bash输出重定向示例:
rqqzpn5f2#
修复前面提到的问题(重新递增
i
并误用cat
)会导致类似下面的结果。注意,date > file_$i
行是用于调试的,以确保每个输出文件在测试开始时都是新的。:
操作符是空操作。<<<
形式引入了“here-doc”。如果$lines
的内容是文件名,而不是问题中指定的文档,则使用<"$lines"
代替<<<"$lines"
。给定splitdoc.data包含以下内容的www.example.com:
和splitdoc.tags与以下内容进行匹配:
然后命令
产生:
kpbpu0083#
我想这会有用的
zdwk9cvp4#
这不是在shell中递增变量的方式:
它会尝试运行一个名称为
$i
当前值的命令。或者更精确地说,
这可能不是问题所在,但确实是个问题,而且会导致奇怪的行为。
我看到的唯一的另一件事是你的文件名周围缺少引号(
"$1"
,"$2"
)。同样,如果每一行都是一个文件名,就不需要
cat
;就做如果每一行都是文件的内容而不是文件名,那么
cat
就完全错了,因为它试图找到一个文件名是那么长的文本。EDIT此外,如果fileB中没有那么多行,您可以避免对fileA中列出的每个文件反复阅读它。只需一次将fileB的所有内容读入内存:
实际上,您甚至可以在一个grep中完成此操作:
ycl3bljg5#
tee
实际上接受多个文件参数,因此它非常简单: