我有两个.rtf 文件....第一个文件有以下内容:
苹果、橙子、香蕉、面条、薯片
第二个文件如下:
Apple I love eat Apple.
Banana I hate Banana.
Zoo I want to go Zoo.
Noodle Noodle can be a very very very very very very very very very very very long, but still is one line.
Chip Don't eat so many chip.
Orange Orange is great, not Apple plx. Noodle
Water Drinking water is boring.
第一个文件是第二个文件的“密钥”。
在第二个文件中,第一个单词是每行的关键。
第二个文件中的每个键和句子仅占一行。第二个文件有许多行键,但并非所有键都存在于 中file1
,但file1
的键必须存在于第二个文件中。
我怎样才能得到这样的结果:(需要按键排序file1
)
Apple, Apple I love eat Apple.
Orange, Orange is great, not Apple plx.
Banana, I hate Banana.
Noodle, can be a very very very very very very very very very very very long, but still is one sentence.
Chip, Don't eat so many chip.
答案1
我会做一些假设(你在问题中似乎同意这些假设)。
- 密钥文件是密钥的 CSV(以逗号分隔的关键字列表)
- 数据文件以第一列开始的第一个字作为键
- 可以通过脚本中的其他一些内容来管理此约束
- 数据文件没有以相同关键字开头的两行
- 如果打破这个约束,
当你寻找密钥时,你会得到所有匹配的行。 - 可以使用“
| tail -1
”来处理,只显示第一个匹配项(例如
- 如果打破这个约束,
- 您开始说
rtf
文件,但将问题标记为text
。
如果您有富文本格式的文件,则应将其转换为文本文件以用于此目的。
这是给你的脚本,
/bin/bash #!/bin/bash IFS="," # -> 在 key.txt 中查找逗号分隔的单词 对于 $(sed 's| ||' key.txt) 中的 k # -----------> 使搜索更容易 做 grep "^$k " 数据.txt # ----> 查找每行开头匹配的关键词 完毕
这key.txt
是您的第一个文件,也是data.txt
您的第二个文件。
循环for
按键的顺序对输出进行排序。
该sed
命令会删除文件中可能存在的任何空格,key.txt
以便于搜索。
更新关于非英文字符(这就是为什么你似乎说的是 RTF 文件):
查找iconv
并将你的 RTF 转换为 UTF-8——我认为grep
可以处理。
如果这就是你想要做的,你的问题应该改写为,
“如何在富文本格式的文件中执行 grep(在 Linux 上)?”
答案2
如果您不需要按密钥文件顺序排序的结果:
sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt
为了进行排序,你可以执行以下操作(在 Bash 中):
sed 's/, /\n/g' keyfile.txt | grep -f - datafile.txt | sort | join -1 2 <(sed 's/, /\n/g' keyfile.txt | nl | sort -k2) - | sort -k2 | cut -d' ' -f1,3-
答案3
这个 Perl 脚本将执行以下操作:
#!/usr/bin/perl
use strict;
use warnings;
open (my $f1, '<', $ARGV[0]) || die "cannot open $ARGV[0] $!\n";
open (my $f2, '<', $ARGV[1]) || die "cannot open $ARGV[1] $!\n";
my $line=join('',<$f1>);
my @f2=<$f2>;
foreach my $e1 (sort split /, /,$line) {
foreach my $e2 (@f2) {
print "$e1, $e2" if ($e2=~/^$e1/);
}
}
答案4
假设您的数据文件是“data.txt”的另一种选择:
for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done