sed/awk/grep

A kerdesem egyszeru, a megoldasaban elakadtam. Talan egy sed/awk/grep guru tudna segiteni.

van egy text fajlom, amiben ki kene torolnom az osszes olyan sort ami datummal kezdodik es a kovetkezo sor is datummal kezdodik.
Jelesul:

a
2017
2017
2017
b
2017
c
2017
2017

||
\ /
\/

a
2017
b
2017
c
2017

a lenyeg, hogy a legutolso datum maradjon meg.

Hozzászólások

Nem pontosan azt csinálja amit kértél, de a példádon ez is működik: uniq < file.txt

A fajl pontosabban:

alma <= mindig betuvel kezdodik
banan <= mindig betuvel kezdodik
2017.01.01 blabla <= mindig szammal kezdodik
2017.01.05 blabla2 <= mindig szammal kezdodik
2017.01.03 blabla3 <= mindig szammal kezdodik
korte <= mindig betuvel kezdodik
narancs <= mindig betuvel kezdodik
barack <= mindig betuvel kezdodik
2017.01.12 blublu <= mindig szammal kezdodik
2017.01.08 blublu2 <= mindig szammal kezdodik
malna <= mindig betuvel kezdodik
2017.01.22 bloblo <= mindig szammal kezdodik

||
\ /
\/

alma <= mindig betuvel kezdodik
banan <= mindig betuvel kezdodik
2017.01.03 blabla3 <= mindig szammal kezdodik
korte <= mindig betuvel kezdodik
narancs <= mindig betuvel kezdodik
barack <= mindig betuvel kezdodik
2017.01.08 blublu2 <= mindig szammal kezdodik
malna <= mindig betuvel kezdodik
2017.01.22 bloblo <= mindig szammal kezdodik

Tehat az egymast koveto datumsorokbol az utolso kell, nem a kronologiailag utolso

A második sed azt csinálja, hogy minden pattern vizsgálatnál összefűz két sort és ha az első sor betűvel kezdődik, de a második 4db számmal, akkor összefűzi és kiírja őket a kimenetre. Ellenkező esetben csak kiírja az első sort (a sorvég karakterrel együtt).


sed '$p;N;/^[0-9]\{4\}.*\n[0-9]\{4\}/D;P;D' < file.txt | sed '$p;$!N;s/^\([a-z].*\)\n\([0-9]\{4\}.*\)$/\1\2/g;P;D'

Nálam macOS alatt megy (és az első válaszomnál említett sorduplikálást sem produkálja). Ez nem GNU sed és mással most nem tudom tesztelni sajnos... :/

Szerk: ha Windowsos progi generálta a CSV-t, akkor lehet hogy nem elég a \n-t kivenni. Kicsit módosítottam, próbáld ki így (a sorduplikálásra is megoldás lehet):


sed '$!N;/^[0-9]\{4\}.*\n[0-9]\{4\}/D;P;D' < file.txt | sed '$!N;s/^\([a-z].*\)\r*\n\([0-9]\{4\}.*\)$/\1\2/g;P;D'

ezt most ugy masoltam (talan megtartotta a sorvegeket)

ID:;00195B2FF60701080126-030D050B3005
SR;30;
ID:;00195B2FF60701081916-0D0E030C2802
SR;31;
ID:;00195B2FF60701083827-140A040F3007
SR;32;

eddig eljutottam. az SR-es sor-t kene az elozoekhez irni mondjuk egy ;-vel

ID:;00195B2FF60701080126-030D050B3005;SR;30;
ID:;00195B2FF60701081916-0D0E030C2802;SR;31;
ID:;00195B2FF60701083827-140A040F3007;SR;32;

... ahogy nezem, a sorvegek sima \n-ek.

sed '$!N;s/^\(ID.*\)\n\(SR.*\)$/\1\2/g;P;D'

csak a masodik referenciat illeszti be. Az elsot (\1) nem.

EDIT:
nem, nem; a sorvegek ^M-ek....

ok. kicsereltem am M-eket es most mukodik.
Koszonom megegyszer a segitseget.

remove.awk:


/^[[:alpha:]]/ {
  if (temp != 0) print(temp)
  temp = 0
  date = 0
  print
}

/^[0-9]{4}.[0-9]{2}.[0-9]{2}/ {
  date = 1
  temp = $0
}

END { if (date == 1) print(temp) }

gawk -f remove.awk < test.txt

Kiegészítés:
De, ha csak a dátum kezdődhet számmal, akkor a második vizsgálatánál elége a

/^[[:digit:]]/ is a /[0-9]… /

helyett.

(off) Mindég érdekelt, hogy ilyen idóta formátumú szövegek honnan jönnek...