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

4 ответа4

1

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

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

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

#!/bin/bash
IFS=","
#    -> to look for comma separated words in key.txt

for k in $(sed 's| ||' key.txt)
#          -----------> to make the search easier
do
  grep "^$k " data.txt
#       ----> look for key words matching at the start of each line
done

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

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

"Как выполнить поиск в файлах форматированного текста (в Linux)?"

0

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

for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done
0

Этот 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

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

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-

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .