Mam „test1.csv” i zawiera
200,400,600,800
100,300,500,700
50,25,125,310
i test2.csv i zawiera
100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
teraz
diff test2.csv test1.csv > result.csv
jest inny niż
diff test1.csv test2.csv > result.csv
Nie wiem, która kolejność jest prawidłowa, ale chcę czegoś innego, oba powyższe polecenia wygenerują coś podobnego
2 > 100,4,2,1,7
3 2,3c3,5
4 < 100,300,500,700
5 < 50,25,125,310
6 \ No newline at end of file
7 ---
8 > 21,22,23,24,25
9 > 50,25,125,310
Chcę wypisać tylko różnicę, dlatego wyniki. Ccs powinny wyglądać tak
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Próbowałem diff -q
i diff -s
ale nie załatwi. Porządek nie ma znaczenia, ważne jest to, że chcę zobaczyć tylko różnicę, nie> ani <ani puste miejsce.
grep -FvF
zrobił lewę na mniejszych plikach, a nie na dużych
pierwszy plik zawiera ponad 5 milionów linii, drugi plik zawiera 1300.
więc results.csv powinien dać ~ 4 998,700 linii
Próbowałem też, grep -F -x -v -f
które nie działały.
50,25,125,310
jest wspólny dla obu plików .. musisz usunąć to z pożądanego wyjścia.Odpowiedzi:
Brzmi jak praca dla
comm
:Jak wyjaśniono w
man comm
:Tak,
-3
oznacza, że tylko linie, które są unikatowe dla jednego z plików zostanie wydrukowany. Są one jednak wcięte zgodnie z plikiem, w którym zostały znalezione. Aby usunąć kartę, użyj:W takim przypadku tak naprawdę nie musisz nawet sortować plików i możesz uprościć powyższe, aby:
źródło
200,[...]
linii, co? :)Używanie
grep
zbash
podstawieniem procesu:Aby zapisać dane wyjściowe jako
results.csv
:<()
jestbash
wzorcem zastępowania procesugrep -vFf test2.csv test1.csv
znajdzie linie tylko dla siebietest1.csv
grep -vFf test1.csv test2.csv
znajdzie linie tylko dla siebietest2.csv
Na koniec podsumowujemy wyniki według
cat
Lub, jak zasugerował Oli , możesz także użyć grupowania poleceń:
Lub po prostu uruchamiaj jeden po drugim, ponieważ obaj piszą do STDOUT, w końcu zostaną dodani:
źródło
cat
dwa przekierowane polecenia? Dlaczego po prostu nie uruchomić jednego?grep ... ; grep ...
lub{ grep ... ; grep ... ; }
jeśli chcesz zrobić coś ze zbiorowym dorobkiem.Jeśli kolejność wierszy nie jest istotna, użyj
awk
lubperl
:Użyj,
grep
aby uzyskać wspólne linie i odfiltrować je:Wewnętrzny grep otrzymuje linie wspólne, a następnie zewnętrzny grep znajduje linie, które nie pasują do tych wspólnych linii.
źródło
sort | uniq -u
, co daje złą odpowiedź, gdy jeden plik zawiera zduplikowane linie. W przypadku grep powiedziałbym „wewnętrzny” / „zewnętrzny”, a nie „wewnętrzny” / „zewnętrzny”.awk
wydrukujesz, a tym, co wydrukujecomm -3
idiff
odpowiedzi.comm -3
. Nie widzę powodu, dla którego miałbym to wyjaśniać. Jeśli chcesz edytować notatkę, nie krępuj się.Skorzystaj z
--*-line-format=...
opcjidiff
Możesz
diff
dokładnie powiedzieć , czego potrzebujesz - wyjaśniono poniżej:Możliwe jest określenie wyjścia diff w bardzo szczegółowy sposób, podobny do
printf
formatu liczbowego.Linie z pierwszego pliku
test1.csv
nazywane są „starymi” liniami, a linie z drugiegotest2.csv
„nowymi” liniami. Ma to sens, gdydiff
służy do sprawdzania, co zmieniło się w pliku.Potrzebne są opcje, aby ustawić format „starych” linii, „nowych” linii i „niezmienionych” linii.
Potrzebne formaty są bardzo proste: w
przypadku zmienionych linii, nowych i starych, chcemy wyświetlać tylko tekst linii.
%L
to symbol formatu tekstu wiersza.Dla niezmienionych linii nie chcemy nic pokazywać.
Dzięki temu możemy napisać opcje takie jak
--old-line-format='%L'
i złożyć wszystko razem, korzystając z przykładowych danych:Uwagi na temat wydajności
Ponieważ pliki mają inny rozmiar, spróbuj wymienić pliki wejściowe, jeśli to nie ma znaczenia, może być tak, że wewnętrzne działanie
diff
może obsługiwać jedną stronę lepiej niż drugą. Lepsze albo wymaga mniej pamięci, albo mniej obliczeń.Istnieje możliwość optymalizacji korzystania
diff
z dużych plików:--speed-large-files
. Wykorzystuje założenia dotyczące struktury pliku, więc nie jest jasne, czy to pomaga w twoim przypadku, ale warto go wypróbować.Opcje formatu opisano
man diff
poniżej--LTYPE-line-format=LFMT
.źródło
Ponieważ kolejność nie musi być zachowana, po prostu:
sort test1.csv test2.csv
: scala i sortujetest1.csv
oraztest2.csv
uniq -u
: drukuje tylko linie, które nie mają duplikatuźródło
diff
rezultacie.