Сравнение шаблонов между двумя файлами в Linux?

1077
user28167

У меня есть два файла .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. 
0

4 ответа на вопрос

1
nik

Я сделаю некоторые предположения (с которыми вы, похоже, согласны в своем вопросе).

  1. Файл ключей представляет собой CSV ключей (список ключевых слов через запятую)
  2. Файл данных имеет ключи в качестве первых слов, начиная с первого столбца
    • этим ограничением можно управлять с помощью некоторых вещей в скрипте
  3. Файл данных не имеет двухстрочных строк, начинающихся с одного и того же ключевого слова.
    • если это ограничение нарушено, вы получите все соответствующие строки,
      когда будете искать ключ.
    • это может быть обработано с " | tail -1", чтобы показать только первый матч (скажем)
  4. Вы начинаете говорить rtfфайлы, но отмечаете вопрос как text.
    Если у вас есть файлы в расширенном текстовом формате, вы должны конвертировать их в текстовые файлы для этой цели.

вот сценарий для вас,

#! / Bin / Баш IFS = "" # -> искать разделенные запятыми слова в key.txt  для k в $ (sed 's | ||' key.txt) # -----------> чтобы упростить поиск делать grep "^ $ k" data.txt # ----> искать ключевые слова в начале каждой строки сделанный 

Вот key.txtваш первый файл и data.txtваш второй файл. Цикл сортирует вывод в порядке ключей. Команда удаляет все пробелы в вашем файле, чтобы упростить поиск.
for
sedkey.txt

Обновление на неанглийских символов (именно поэтому она, кажется, вы говорите, файл в формате RTF):
Посмотрите iconvи получить RTF преобразовать в UTF-8 - Я думаю, что grepможет справиться с этим.
Если это то, что вы хотите сделать, ваш вопрос должен быть перефразирован как

"Как получить доступ к файлам в формате rich text (в linux)?"

0
user36322

Другой вариант, предполагающий, что ваш файл данных - «data.txt»:

for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done 
какой-то вопрос по txt, может ли txt отображать неанглийские символы / слова? user28167 14 лет назад 0
0
drewk

Этот 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/); } } 
0
Dennis Williamson

Если вам не нужен результат, отсортированный по порядку ключевого файла:

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- 

Похожие вопросы