Mam plik w następującym formacie:
$ cat /tmp/raw
2015-01 5000 1000
2015-02 6000 2000
2015-03 7000 3000
Teraz chcę uzyskać połączoną wartość z kolumn 2 i 3 w każdym wierszu, aby wyniki były następujące:
2015-01 6000
2015-02 8000
2015-03 9000
Próbowałem tego, ale pokazuje tylko ostatnią wartość w pliku, taką jak wartość 2015-03.
text-processing
Syed Jahanzaib
źródło
źródło
Oto kilka sposobów:
Kolejne podejście awk
Perl
lub
Shell (znacznie wolniejszy / mniej wydajny niż powyższe)
źródło
$2+=$3
może być bardziej niesamowity.awk '{$2+=$3}NF--'
aby nie wisiało puste pole 3. Chociaż to tylko moja preferencja i jest zbyt podobna, by pisać jako odpowiedź sama w sobie :)sed
jakiś sposób udaje się zrozumieć pola - nawet zdefiniować pola w locie i pola w / w polach - ale, jak się wydaje, cała koncepcja dopasowywania wyrażeń regularnych w systemie Unix opiera się na podzieleniu łańcucha na pola według wzoru ! Kto wiedział?... drukuje ...
Tak więc powyżej deklaruję wyrażenie regularne, które definiuje zasięg pola, który składa się z pojedynczej sekwencji znaków o
*
zmiennej długości , które^
nie są <spacja>, po której następuje bezpośrednio pojedyncza sekwencja znaków o*
zmiennej długości, <p> . Ta deklaracja jest stosowana dosed
przestrzeni wzorców, która jest łańcuchem ograniczonym (domyślnie) każdym\n
znakiem ewline występującym na wejściu, i który jest rekurencyjnie zastępowany (domyślnie) następnym dla każdego wystąpienia tego samego.Interfejs tej deklaracji jest dwojaki, a na każdym poziomie jest w pełni regulowany i określony przez co najmniej jedną międzynarodową oficjalną komisję normalizacyjną IEEE, aby zapewnić przewidywalne stosowanie
sed
składni poleceń. Na przykładsed
składnia API jest stosowana w tym przypadku do polecenia/
adresowego (które zawsze jest pierwszym składnikiem każdego polecenia ubstitution) , ale jego treść jest interpretowana przez bardziej podstawowy interfejs API jako podzbiór tego określonego dla parametru funkcja w standardowej biblioteki C ./
sed s///
regcomp()
Mogę wypowiadać te stwierdzenia pewnie, ponieważ nie
sed
jest to tylko program, ale raczej skompilowany plik wykonywalny nazwanysed
na mojej maszynie podobnej do Uniksa jest implementacją dobrze zdefiniowanej, historycznie ustalonej i kontrolowanej przez normysed
aplikacji regularnego systemu biblioteki dopasowujące wyrażenia.Ze
sed
specyfikacji:... gdzie znajdujemy ...
Aplikacja, która domaga
regcomp()
się przedstawić wzór ciąg i ...Aby zareagować na to, wspomniana aplikacja będzie odnosić się do
regcomp()
funkcji pomocniczej ...I kiedy to zrobię ...
...
sed
najpierw kompiluje wyrażenie regularne i przechowuje wyniki w pamięci, a następnie stosuje zapisany tam skompilowany automat do zawartości mojej przestrzeni wzorcowej tyle razy, ile jest to konieczne do wypełnienia mojego polecenia. Za każdym razem, gdy tak się dzieje, wynikiem jest tablica jednego lub więcej pól rozdzielanych zerami, które są rozdzielane przy odsunięciu przezregexec()
.A kiedy to zrobię ...
... aby wskazać, że należy użyć ostatnio zdefiniowanego wyrażenia regularnego,
sed
może po prostu wywołaćregexec()
ponowne użycie wstępnie skompilowanego wyrażenia regularnego, ale możliwe, że zastosuje go tym razem do zmienionego argumentu ciągu lub zastosuje nowe parametry nmatch jako polecenie.A dokładniej jeszcze ...
s/[^ ]* */[&]P/
[
lewy nawias kwadratowy, potem na&
siebie, potem na]
prawy nawias kwadratowy, po którym następujeP
znak.s//&+pc/3
3
trzecie wystąpienie wzorca w przestrzeni wzorca&
, a po nim dołączony ciąg+pc
.I tak dla każdego wiersza
sed
wejścia zapisuje na standardowe wyjście, biorąc pod uwagę twoje przykładowe dane:Może to wyglądać dziwnie, ale
dc
kalkulator cytuje łańcuchy w danych wejściowych między nawiasami kwadratowymi, aP
polecenie zarówno wydrukuje górę stosu bez dołączania\n
ewline, jak i następnie usunie go ze stosu wejściowego.I tak, używając pierwszego wiersza jako przykładu,
dc
zrobi:[2015-01 ]P
P
rint i pop na szczycie stosu5000
5000
na wierzch stosu i popchnij wszystkie elementy znajdujące się obecnie na stosie (teraz żaden) o jeden.1000
+
6000
.[
ciągiem]
.p
p
przeglądnij górę stosu, a następnie dołączoną\n
ewline bez wyskakiwania z niego ze stosu.c
c
poznaj stosźródło