LINUX.ORG.RU

пересечений текстовых файлов...


0

0

Что-то не соображу, как лучше сделать такую вещь: есть два текстовых файла, причем все строки первого из них - подмножество строк второго. А нужно выделить все строки, содержащиеся во втором файле, но не входящие в первый.

Т.е. если

--- file_1 ----
YYY
XXXXXXX
---------------

--- file_2 ----
AAAAA
YYY
123
aaaabbb
XXXXXXX
---------------

то нужно получить

AAAAA
123
aaaabbb

Подскажите, плиз, как это быстро сделать...

Спасибо!

anonymous

cat file_1 file_2 | sort | uniq -u

Dead ★★★★
()

если нужно готовое решение, то man diff.

Если нужен алгоритм, то для этой задачи вообще элементарно

typedef char * line; line text1[N] /* здесь эталонный текст */,text2[N] /* здесь с избыточными строками */;

...

void process() {

uint j=0;

for (uint i=0;i<N;i++) { while (!cmp(text1[i],text2[j]) { print_line_not_in_text1(text2[j]); j++; } if (j<M) j++; else return; } }

anonymous
()
Ответ на: комментарий от josephson

Спасибо, но оба способа не подходят. Первый - sort мешает, порядок не должен нарушаться; второй способ не работает:

bash-2.05b$ grep -v -e "`cat file_1.txt`" file_2.txt
bash: /bin/grep: Argument list too long

jek_
()
Ответ на: комментарий от jek_

Алгоритм очевиден, конечно. А с diff я что-то не могу разобраться, как заставить его выводить в правильном виде :( Он вставляет дополнительные сведения - номера строк и прочее....

jek_
()

Для bash:

f1=f1.txt
f2=f2.txt
sep=$'\001'
join -v1 -j2 -t "$sep" -o '1.1 1.2' <(nl -w1 -s "$sep" "$f1" |sort -t "$sep" -k 2) <(nl -w1 -s "$sep" "$f2" |sort -t "$sep" -k 2) |sort -n |cut -d "$sep" -f 2-
unset sep f1 f2

watashiwa_daredeska ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.