Обмен столбцов в файле и удаление дубликатов - PullRequest
1 голос
/ 12 апреля 2010

У меня есть такой файл:

term1 term2
term3 term4
term2 term1
term5 term3
..... .....

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

term1 term2

и

term2 term1

для меня дубликат. Это действительно длинный файл, поэтому я не уверен, что может быть быстрее. У кого-нибудь есть идеи как это сделать? возможно, awk?

Ответы [ 7 ]

1 голос
/ 13 апреля 2010
awk '($2FS$1 in _){
 delete _[$1FS$2];delete _[$2FS$1]
 next
} { _[$1FS$2] }
END{ for(i in _)  print i } ' file

выход

$ cat file
term1 term2
term3 term4
term2 term1
term5 term3
term3 term5
term6 term7

$ ./shell.sh
term6 term7
term3 term4
1 голос
/ 17 апреля 2010

Я бы сделал это (если вам не нужно хранить двойные столбцы):

sed 's/ /\n/g' test.txt | sort -u

Вот как выглядит вывод (не обращайте внимания на мое фанки-приглашение):

[~]
==> cat test.txt
term1 term2
term3 term4
term2 term1
term5 term3
[~]
==> sed 's/ /\n/g' test.txt | sort -u
term1
term2
term3
term4
term5
1 голос
/ 13 апреля 2010

Если вы хотите удалить и"term1 term2" и "term2 term1":

join -v 1 -1 1 <(sort input_file) -v 2 -2 2 <(sort -k 2 input_file) | uniq
1 голос
/ 13 апреля 2010

Если файл очень очень длинный, возможно, вам стоит подумать о написании вашей программы на C / C ++. Я думаю, что это было бы самым быстрым решением (особенно если вам нужно обработать все файлы для каждой прочитанной строки). Обработка с использованием функций bash становится очень медленной с большими файлами и повторяющимися операциями

1 голос
/ 13 апреля 2010

Чтобы сохранить исходный порядок, простое (но не обязательно быстрое и / или эффективное использование памяти) решение в awk:

awk '!seen[$1 " " $2] && !seen[$2 " " $1] { seen[$1 " " $2] = 1; print }

Редактировать: сортировка альтернативы в рубине:

ruby -n -e 'puts $_.split.sort.join(" ")' | sort | uniq
1 голос
/ 13 апреля 2010

В perl:

while($t=<>) {
 @ts=sort split(/\s+/, $t);
 $t1 = join(" ", @ts);
 print $t unless exists $done{$t1};
 $done{$t1}++;
}

Или:

cat yourfile | perl -n -e  'print join(" ", sort split) . "\n";' | sort | uniq

Я не уверен, какой из них лучше подходит для больших файлов. Первый создает в памяти огромный хеш-файл perl, второй вызывает команду «sort» ...

1 голос
/ 13 апреля 2010

Упорядочивать каждое слово в строке и сортировать легко с помощью perl.

. / Scriptbelow.pl

#!/usr/bin/perl

foreach(sort map { reorder($_) } <>) {
    print;
}

sub reorder {
    return join(' ', sort { $a cmp $b } split(/\s+/, $_)) . "\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...