Сопоставление с образцом между двумя файлами в Linux?

У меня есть два .rtf файла.... Первый имеет это содержание:

Apple, оранжевая, банан, лапша, микросхема

Второй Файл - что-то вроде этого:

     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
задан 28.10.2017, 00:47

4 ответа

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

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

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

#!/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 может обработать это.
Если, именно это Вы хотите сделать, Ваш вопрос должен быть перефразирован как,

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

1
ответ дан 24.11.2019, 12:32

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

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-
0
ответ дан 24.11.2019, 12:32

Этот сценарий 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
ответ дан 24.11.2019, 12:32

Другой опцией, принимающей Ваш файл данных, является 'data.txt':

for k in Apple Orange Banana Noodle Chip; do echo -n "$k, "; grep "^$k" data.txt; done
0
ответ дан 24.11.2019, 12:32

Теги

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