Muszę wziąć listę (obciążenia) adresów IP w tym formacie:
134.27.128.0
111.245.48.0
109.21.244.0
i zamień je w ten format, umieszczając między nimi potok (utworzone adresy IP)
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
Myślę, że jest to polecenie znajdowania i zastępowania, sed
ale nie mogę go uruchomić.
shell
text-processing
uselesslinuxman
źródło
źródło
tr
połączyć nowe wiersze w|
rury? Jak<ipfile tr \\n \| >outfile
?|
wymagana jest przestrzeń wokół ?<
. Tak<mydoc tr \\n \| >mydoc2
. Ale to nie zapewni ci przestrzeni. Dla tych, prawdopodobnie najszybszym rozwiązaniem jestpaste -d' | ' mydoc /dev/null /dev/null >mydoc2
paste
zapisuje wiersze odpowiadające każdemu plikowi. Bez-s
tego otrzymasz liczbę wierszy, które masz w pliku.Odpowiedzi:
Korzystanie sed, na podstawie Znani sed jednej wkładki Poradnik, część I: : 39. Dołącz linia do następnej, jeśli kończy się backslash „\” (z wyjątkiem tutaj ignorujemy część o ukośnik i załóż
\n
nowe linie Europejska wymagany|
separator):powinien produkować w
mydoc2
źródło
sed 'H;1h;$!d;x;s/\n/ | /g'
jest liniowy.sed
przestrzeń wzorów 8K; to o wiele mniej niż 16 milionów.Byłem ciekawy, jak niektóre z tych (+ niektóre alternatywy) działają szybko z dość dużym plikiem (
163MiB
jedenIP
na linię, ~ 13 milionów linii):Wyniki (
sync; echo 3 > /proc/sys/vm/drop_caches
po każdym poleceniu; powtórzyłem testy - w odwrotnej kolejności - po kilku godzinach, ale różnice były znikome; zauważ też, że używamgnu sed
):steeldriver :
bardzo wolny. Przerwany po dwóch minutach oczekiwania ... więc nie ma dla niego żadnego wyniku.
cuonglm :
mikeserv :
jthill :
Avinash Raj :
i
val0x00ff :
które to środki
184.321s
. Nic dziwnego, że jest to 200 razy wolniej niż rozwiązanie mikeserv .Oto kilka innych sposobów korzystania z
awk:
perl:
xargs:
połączenie głowy + pasty + tr + kota:
Jeśli masz
GNU coreutils
i jeśli twoja lista adresów IP nie jest naprawdę duża (powiedzmy do 50000 adresów IP), możesz to również zrobić za pomocąpr
:gdzie
np. dla pliku 6-liniowego:
Komenda:
wyjścia:
źródło
while ... read
pętli? Jestem ciekawy, co przekłada się na 163kread()
iwrite()
połączenia. Nawiasem mówiąc, świetna odpowiedź.sed
w tym czasie poprawiła się jego pozycja (i prawdopodobnie wprowadzono tylko kilka zmian w jego silniku regexp), alegrep
wydaje się, że znacznie spadła pod względem wydajności (szczególnie w przypadku dłuższych linii) ? Zastanawiam się, czyperl
dodatki do silnika mają jakikolwiek wpływ na te wyniki ... To teżdash
jest fajne, że nie jest beznadziejne .bash
Tutaj będzie prawdopodobnie znacznie wolniej w / wspólnaIFS=
poprzedzany.lex
prawidłowo używać .Możesz użyć awk :
ORS=' | '
ustaw separator rekordów wyjściowych na' | '
zamiast nowego wiersza.lub edytuj w miejscu za pomocą
perl
:źródło
paste
działa. bardzo mile widziane.paste
rozwiązanie jest najszybsze.ORS=""
wewnątrzEND
blokuORS="\n"
tak, aby to zrobiło.Więc źle to wszystko zrozumiałem - i to pytanie wiele mnie nauczyło
paste
. Jak słusznie zauważa cuonglm, chyba że jesteśpaste
w erialnym pliku-s
, zawsze\n
skończysz w / ewline z listy infile dołączanej do wyjścia w miarę jego zapisywania. Myliłem się w przekonaniu, żepaste -s
zachowanie było jego domyślnym trybem - i jest to nieporozumienie, które, jak się wydaje, zbusybox
paste
przyjemnością umacnia. Następujące polecenie działa jak w reklamiebusybox
:Jednak nie działa zgodnie ze specyfikacją. Prawidłowo zaimplementowana
paste
nadal\n
dołączałaby końcową ewline dla każdej zapisanej sekwencji. Mimo wszystko to nie jest wielka sprawa:źródło
pr
na myśli, ale najwyraźniej nie ma pary z dużymi plikami wejściowymi, więc nie mogłem faktycznie przetestować prędkości, ale przy plikach o rozsądnej długości działa OK. Twoje rozwiązanie jest zdecydowanie najszybsze (nic dziwnego -paste
jest naprawdę szybkie), patrz mój post.jednowarstwowa z tr i sed:
źródło
Wykorzystaj
vim
:Wyjaśnienie:
-n
wyłącz plik wymiany-u NONE
służy do pominięcia wszystkich inicjalizacji.-c {command}
wykonać polecenia po odczytaniu pliku.1,$-1s/\n/ | /g
tos/\n/ | /g
(zamień znak nowej linii spacją odstępu) dla zakresu1,$-1s
(od 1. linii do ostatniej linii - 1)wq!
wymuś pisanie i wyjścieUwaga:
W zależności od tego, jak duży jest Twój plik, może to być zły pomysł.
źródło
Poprzez python.
przestrzenie wcześniej
print
były bardzo ważne.źródło
Oto inny za pomocą
xxd
źródło
Dla kompletności, oto inne
awk
rozwiązanie oparte na tym, któreORS
w ogóle nie używa :Aby uzyskać wyjaśnienie, zobacz mój post na /unix//a/338121/117599 .
źródło