Jak mogę użyć awk
w następującej sytuacji?
Chcę połączyć wiersze zaczynające się od tej samej kolumny. Jedynie pierwsza kolumna jest utrzymywana po dołączyć (w tym przypadku aaa
, www
, hhh
).
Plik może być rozdzielony spacjami lub tabulatorami.
Przykładowe dane wejściowe:
aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL
Pożądane wyjście:
aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL
Tłem tego jest to, że chcę skonfigurować bardzo prostą bazę danych opartą na plikach, w której pierwsza kolumna jest zawsze identyfikatorem encji. Wszystkie wiersze oparte na tej samej kolumnie identyfikatora są konkatenowane.
text-processing
sed
awk
malutki
źródło
źródło
uuu
pochodzi linia (w danych wyjściowych)?Odpowiedzi:
Aby uzyskać pierwsze kolumny w każdej linii za pomocą awk, możesz wykonać następujące czynności:
To są twoje klucze do reszty linii. Możesz więc utworzyć tabelę skrótów, używając pierwszej kolumny jako klucza, a drugiej kolumny linii jako wartości:
Aby uzyskać całą resztę wiersza, zaczynając od kolumny 2, musisz zebrać wszystkie kolumny:
źródło
Ktoś inny może odpowiedzieć w awk lub sed, ale wersja Python jest prosta i może być dla ciebie pomocna.
źródło
Jest to bardziej interesujące zastosowanie coreutils, podejrzewam, że nie jest bardzo wydajne przy dużych wejściach, ponieważ wywołuje łączenie dla każdej linii na wejściu.
Aby poprawić jego efektywność, pomocne może być oszczędzanie
outfile
itmp
RAMDISK.Edytować
Lub bez plików tymczasowych:
źródło
A oto liniowiec PERL:
źródło