LINUX.ORG.RU

Как из одного txt файла удалить все строки которые встречаются в другом txt файле

 


0

2

Всем доброго времени суток! Как из одного txt файла удалить все строки которые встречаются в другом txt файле. Пример строк в файлах: 1.txt:

2.txt:

должен выйти результат: result.txt:

Ну нужно сравнивать не полностью всю строку, а только домены которые находяться между символами //тут домен/



Последнее исправление: Karpov680 (всего исправлений: 7)

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

Спасибо большое но данная команда проверяет на дубли целые строки в файлах, а мне нужно чтоб проверка на дубли была между символами //любой текст/

Karpov680
() автор топика

Если правильно, то вот так:

 perl -e 'open($fAll, "<file.txt"); open($fExcl, "<excl.txt"); foreach (<$fExcl>) { $host=$_; $host =~ s#^.+//##g; $host =~ s#/.*##g; $hash{$host}=1} foreach (<$fAll>) {$host=$_; $host =~ s#^.+//##g; $host =~ s#/.*##g; if (!exists($hash{$host})) {print $_}} '

Свои некорректные комментарии удалил.

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

Спасибо большое все работает. хотел еще спросить, как сделать чтоб результат сохраняло в txt файл, а не выводило результат в терминале

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

Пожалуйста. :) В конце команды можно добавить > [файл]. Например,

perl -e '...' > rezultat.txt
PHPFan
()
grep -o '//[^/]\+/' 2.txt | grep -vFf - 1.txt > result.txt
Jini ★★
()
Последнее исправление: Jini (всего исправлений: 2)

ммм, задание на собеседование, да?

anonymous
()

Каждый год в зимнюю сессию мы с друзьями ходим в баню я вижу на ЛОРе этот вопрос в незначительно отличающемся виде. А во время семестра учиться не судьба была?

redgremlin ★★★★★
()

moreutils/combine

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

Тем, что у неё есть документация, а что делает код на перле уже через месяц не вспомнишь.

legolegs ★★★★★
()

Можешь модифицировать этот велосипед:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <err.h>

void help(char* name){
	printf("\nUsage:\n\t%s <file1> <file2>\n\t\tprint lines of <file1>, that not present in <file2>\n", name);
	printf("\t%s -v <file1> < file2>\n\t\tshows lines of <file1>, that present in <file2>\n", name);
	exit(0);
}

int main(int argc, char** argv){
	char *buf, *F1, *F2, *ptr, *ptr1;
	int file1, file2, n = 0, Vflag = 0;
	long size1, size2;
	struct stat St;
	if(argc < 3 || strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help")  == 0) help(argv[0]);
	if(strcmp(argv[1], "-v") == 0){ Vflag = 1; n = 1;}
	if( stat(argv[n+1], &St) < 0) err(1, "\n\tCan't stat %s", argv[n+1]);
	size1 = St.st_size;
	if( stat(argv[n+2], &St) < 0) err(2, "\n\tCan't stat %s", argv[n+2]);
	size2 = St.st_size;
	file1 = open(argv[n+1], O_RDONLY);
	if(file1 < 0) err(3, "\n\tCan't open %s", argv[n+1]);
	file2 = open(argv[n+2], O_RDONLY);
	if(file2 < 0) err(4, "\n\tCan't open %s", argv[n+2]);
	buf = malloc(16385); // буфер для строки
	F1 = malloc(size1 + 1); // содержимое файла 1
	ptr1 = F1;
	F2 = malloc(size2 + 1); // содержимое файла 2
	if(read(file1, F1, size1) != size1) err(5, "\n\tCan't read %s", argv[n+1]);
	F1[size1] = 0;
	close(file1);
	if(read(file2, F2, size2) != size2) err(6, "\n\tCan't read %s", argv[n+2]);
	F2[size2] = 0;
	close(file2);
	while(ptr1){
		ptr = strchr(ptr1, '\n');
		if(ptr) *ptr = 0;
		strncpy(buf, ptr1, 16384);
		if(strstr(F2, buf) == NULL){ if (Vflag == 0) printf("%s\n", buf);}
		else if(Vflag == 1) printf("%s\n", buf);
		if(ptr) ptr1 = ptr + 1;
		else ptr1 = NULL; // конец строки
	}
	free(buf); free(F1); free(F2);
	exit(0);
}

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