To pytanie jest ściśle związane z tym i tym pytaniem. Mam plik, który zawiera kilka linii, z których każda jest ścieżką do pliku. Teraz chcę sparować każdą linię z każdą inną linią (nie samą). Również para A B
jest równa B A
parze dla moich celów, więc należy utworzyć tylko jedną z tych kombinacji.
Przykład
files.dat
czyta się tak w notacji skrótowej, każda litera jest ścieżką do pliku (bezwzględną lub względną)
a
b
c
d
e
Zatem mój wynik powinien wyglądać mniej więcej tak:
a b
a c
a d
a e
b c
b d
b e
c d
c e
d e
Najlepiej chciałbym rozwiązać to w bash. W przeciwieństwie do innych pytań, moja lista plików jest raczej niewielka (około 200 linii), więc używanie pętli i pojemności pamięci RAM nie stanowi problemu.
Odpowiedzi:
Użyj tego polecenia:
PROCINFO
może byćgawk
rozszerzeniem. Jeśliawk
nie obsługuje tego, po prostu pomińPROCINFO["sorted_in"] = "@ind_str_asc"
linię i potokuj wyjściesort
(jeśli chcesz posortować dane wyjściowe).( Nie wymaga to sortowania danych wejściowych).
źródło
Zakłada się, że żadna linia w pliku wejściowym nie zawiera białych znaków. Zakłada również, że plik jest posortowany .
join
Polecenie tworzy pełny przekrój produkt z linii w pliku. Robi to, łącząc plik ze sobą w nieistniejącym polu. Niestandardowy-j 2
może zostać zastąpiony przez-1 2 -2 2
(ale nie przez,-j2
chyba że używasz GNUjoin
).awk
Polecenie odczytuje wynik ten i wyprowadza tylko wyniki, które są pary, które nie zostały jeszcze widoczne.źródło
sort -b
by to posortować.join
wymagają posortowanych plików wejściowych.python
Rozwiązaniem. Plik wejściowy jest dostarczanyitertools.combinations
ze standardowej biblioteki, która generuje krotki o długości 2, które są formatowane i drukowane na standardowe wyjście.źródło
Jeśli
ruby
zainstalowałeś:-0777
slurp cały plik (powinno być w porządku, ponieważ w OP podano, że rozmiar pliku jest mały)-F'\n'
podzielone na podstawie nowej linii, więc każda linia będzie elementem w$F
tablicy$F.combination(2)
generuj kombinacje2
elementów na raz{ |c| puts c.join(" ")}
wydrukuj zgodnie z wymaganiami$F.uniq.combination(2)
dla 3 elementów jednocześnie:
Z
perl
(nie ogólne)Z
awk
źródło
Oto jeden w czystej skorupie.
Przykład:
źródło
<file.dat xargs test.sh
test.sh $(cat file.dat)
Za pomocą
Perl
możemy to zrobić jak pokazano:źródło