Mam plik output.txt po uruchomieniu skryptu powłoki w następujący sposób:
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016
Plik tekstowy ma wiele wpisów wiersz po wierszu w ten sam sposób. Chcę wydrukować te wartości w kolumnach: Nazwa pliku, Status i Datownik w następujący sposób:
Filename Status Timestamp
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2 Sat Nov 12 03:00:09 2016
command-line
bash
scripts
text-processing
linux09
źródło
źródło
abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016
. Zredagowałem twoje pytanie, aby pasowało do tego, co mówi, z podanym przykładem. Cofnij się, ale pamiętaj, że naprawdę musisz wyjaśnić, czego dokładnie chcesz - wartości w kolumnach lub wartości oddzielone przecinkamiOdpowiedzi:
Z
paste
:spowoduje to wyświetlenie zawartości pliku rozdzielonego znakiem nowej linii jako kolumn oraz trzech kolumn rozdzielonych tabulatorami w wierszu.
Dodanie nagłówka:
Aby skolumnizować wyniki, skorzystaj z pomocy
column
:Przykład:
źródło
echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
Możesz użyć awk:
Wynik może nie być tak ładny:
Możesz
%s\t
zamiast tego użyć wyjścia rozdzielonego tabulatorami.NR % 3
wynosi zero (i fałsz) dla każdej trzeciej linii, więc pozostałe linie są drukowane ze spacją po nich zamiast nowej linii.next
po prostu rozpoczyna następną iterację.1
, z nową linią po niej, ponieważ nie pasuje do pierwszego bloku.źródło
Istnieje również
rs
( narzędzie hape r e s hape):W szczególności,
Więc
lub (aby dodać nagłówek)
źródło
Dla kompletności możesz to zrobić
sed
również:1iFilename\tStatus\tTimestamp
wstawia wiersz nagłówka przed wierszem 1N;N
wczytuje jeszcze dwa wiersze do bufora wzorców, dając w sumie 3 oddzielone wiersze nowego wierszay/\n/\t/
zastępuje wszystkie znaki nowej linii tabulatorami w buforze wzorówTe
i
,N
orazy
sed polecenia są opisane tutaj .źródło
Zawsze można ugotować coś do przetwarzania tekstu za pomocą AWK lub Perla i oczywiście Pythona, co zapewnia ta odpowiedź.
Jako jednowarstwowy:
Jako skrypt wielowierszowy
Podstawową ideą jest podanie skryptu przez stdin (przy użyciu przekierowania powłoki
<
, chociaż można również użyć potoku). Skrypt używa tabulatorów do oddzielania pól, chociaż spacje mogą być również wykorzystane do uzyskania bardziej precyzyjnego wyniku.Przykładowe dane wyjściowe na przykładzie danych wejściowych dostarczonych przez OP:
źródło