Portál AbcLinuxu, 12. května 2025 11:21
Mám plain text:
[Date.UTC(2014, 11, 23, 5, 12, 0, 0), 3], [Date.UTC(2014, 11, 23, 5, 14, 0, 0), 3], [Date.UTC(2014, 11, 23, 5, 16, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 18, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 20, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 22, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 24, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 26, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 28, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 30, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 32, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 34, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 36, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 38, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 40, 0, 0), 0],
A potřeboval bych odstranit řádky výše zvýrazněné kurzívou, aby to vypadalo takto:
[Date.UTC(2014, 11, 23, 5, 12, 0, 0), 3], [Date.UTC(2014, 11, 23, 5, 14, 0, 0), 3], [Date.UTC(2014, 11, 23, 5, 16, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 26, 0, 0), 2], [Date.UTC(2014, 11, 23, 5, 28, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 38, 0, 0), 1], [Date.UTC(2014, 11, 23, 5, 40, 0, 0), 0],
Konkrétně potřebuji porovnávat poslední číselný údaj a v případě souvislého opakování ponechat pouze první a poslední záznam.
Dá se to relativně jednoduše zvládnout pomocí sed či awk? Pokud ne, asi bych to řešil mechanicky v bashi (načítání řádků, porovnávání hodnoty, vymazání nadbytečného řádku a pořád dokola, dokud bude co mazat).
Řešení dotazu:
cat soubor | sort -k8 -u -r >soubor1 tac soubor | sort -k8 -u -r >soubor2 #paste -d '\n' soubor1 soubor2 >vysledek paste -d '\n' soubor1 soubor2 | uniq >vysledek
perl -00 -pe 's/(\N* (\d+)\],\n).*\n(\N* \2\],\n)/$1$3/msg'
perl -ne ' /(\d+)\],/; print $pred_radek if $1!=$pred or $pred2!=$pred; $pred2=$pred; $pred=$1; $pred_radek=$_'vytiskni řádek jestli se předešlý nebo následující řádek liší v čísle před
],
Ps. samozřejmě by bylo přehlednější napsat Perl script než tento "one-liner"
perl -ne ' /(\d+)\],/; print if 1..1; print $pred_radek if $1!=$pred or $pred2!=$pred; $pred2=$pred; $pred=$1; $pred_radek=$_'
0],
jinak ho to tiskne, tak bych spíš doporučoval něco jako:
perl -ne 'BEGIN{$pred=-1}; /(\d+)\],/; print $pred_radek if $1!=$pred or $pred2!=$pred; $pred2=$pred; $pred=$1;$pred_radek=$_' #problém by ještě nastal kdyby "poslední" řádek nekončil
\n
, pak by se nevytiskl
sed -re 'H;x;/([0-9]+)\].*\1\]/d'
[Date.UTC(2014, 11, 25, 10, 36, 36, 0), 1], [Date.UTC(2014, 11, 25, 10, 38, 38, 0), 1], [Date.UTC(2014, 11, 25, 10, 40, 40, 0), 1], [Date.UTC(2014, 11, 25, 10, 42, 42, 0), 1], [Date.UTC(2014, 11, 25, 10, 44, 44, 0), 0], [Date.UTC(2014, 11, 25, 10, 50, 50, 0), 0], [Date.UTC(2014, 11, 25, 10, 52, 52, 0), 1], [Date.UTC(2014, 11, 25, 10, 54, 54, 0), 0], [Date.UTC(2014, 11, 25, 15, 42, 42, 0), 0], [Date.UTC(2014, 11, 25, 15, 44, 44, 0), 1], [Date.UTC(2014, 11, 25, 15, 46, 46, 0), 3],
[Date.UTC(2014, 11, 25, 10, 36, 36, 0), 1], [Date.UTC(2014, 11, 25, 10, 42, 42, 0), 1], [Date.UTC(2014, 11, 25, 10, 44, 44, 0), 0], [Date.UTC(2014, 11, 25, 10, 50, 50, 0), 0], [Date.UTC(2014, 11, 25, 10, 52, 52, 0), 1], [Date.UTC(2014, 11, 25, 10, 52, 52, 0), 1], [Date.UTC(2014, 11, 25, 10, 54, 54, 0), 0], [Date.UTC(2014, 11, 25, 15, 42, 42, 0), 0], [Date.UTC(2014, 11, 25, 15, 44, 44, 0), 1], [Date.UTC(2014, 11, 25, 15, 44, 44, 0), 1], [Date.UTC(2014, 11, 25, 15, 46, 46, 0), 3],
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.