majdnem azonos sorok

Hogyan tudnám eltávolítani a majdnem egyező sorokat a fájlból parancs(ok) segítségével?

teszt.txt

AMC:714000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:251:111+112:63
AMC HD:314000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:101:34+35:72
ATV:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:5300:5301:35
ATV HD:378000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:101:5401:36
ATV Spirit:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4800:4801:37
ATV Spirit HD:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4900:4901:38
AXN:706000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:510:501+504:56
BBC earth:706000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:491:497+493+494:150
 

Egyértelműen nincs szükségem a két azonos csatornából az SD változatra. De pl. az AXN-ből nincs HD, annak meg kell maradnia.

Ez: 

grep -hFv "$(grep ' HD' teszt.txt | cut -d: -f1)" teszt.txt

pont a HD-ket szedi ki. A -v nélkül meg eltűnik az is ami megmaradhatna. Próbálkoztam awk,sed-del, de lehet rossz paraméterekkel. 

Hozzászólások

Egy lehetséges megoldás az alábbi.

Az ötlet az, hogy az 1. és 2. oszlopok közé vezessünk be egy új oszlopot. Az így előálló új oszlopokat jelöljük 1.', 2.', 3.' sorszámokkal.

Az 1.' oszlopot úgy kapjuk az 1. oszlopból, hogy az esetleges " HD" szuffixet levágjuk.

A 2.' oszlopot így képezzük az 1. oszlopból, hogy " HD" szuffix jelenléte esetén a "2" értéket képezzük, egyébként pedig az "1" értéket.

A 3.' és további oszlopok megtartják a bemeneti értékeket.

Ezután a táblázat minden oszlopában a cellákat azonos szélességűre töltjük. Az így előálló cellaszélességet megmérjük.

A táblázatot csökkenő sorba rendezzük. Fontos, hogy így bármely, eredetileg HD-ként megjelölt csatorna az SD párja fölé fog kerülni.

A uniq paranccsal a táblázatot megszűrjük úgy, hogy csak az 1.' (fix szélességűre töltött) oszlop egyediségét kérjük.

sed --quiet --regexp-extended \
    --expression='s/^([^:]*) HD:/\1:2:/p' \
    --expression='t' \
    --expression='s/^([^:]*):/\1:1:/p' \
  channels.txt \
| column --table --separator=':' --output-separator=':' \
> channels-fixed-width.txt

COL1W=$(head --lines=1 channels-fixed-width.txt \
        | cut --fields=1 --delimiter=':' \
        | wc --max-line-length)

sort --reverse channels-fixed-width.txt \
| uniq --check-chars="$COL1W"

A táblázat további formázása (rendezése növekvő sorba, esetleges visszaalakítása az eredeti oszlopformátumra) az olvasó feladata...

... lehetséges egyszerűsítés, hogy a 2.' oszlopban az "1" és "2" értékek hozzárendelését megfordítjuk (vagyis válasszuk az "1"-et a " HD" szuffix esetén, a "2"-t egyébként), és akkor a --reverse opciót elhagyhatjuk a sort-nál.

 

(Erre egy kicsit nehezebben áll rá az ember agya, mert a "HD"-t ösztönösen "magasabb" értékkel (2) akarja ellátni, mint az SD-t (1). Akkor pedig, mivel a uniq az első előfordulást tartja meg, a rendezésnek a csökkenő rendűnek kell lennie.)

Nos csak sikerült egy tök egyszerű megoldást összehoznom.

tac teszt.txt | awk '!p||NR!=p+1; /HD/ {p=NR}' | tac
Szerkesztve: 2021. 01. 04., h – 13:55
sort teszt.txt | sed 's, HD,,' | sort --field-separator=: -k1,1 -s -u

Sorbarakjuk a teszt.txt fájlodat, így a HD előre kerül. Ezután leszedjük a HD jelzéseket, majd csak az első mező alapján (határoló karakter a kettőspont) sorbarendezzük, valamint ha az első mező azonos, akkor a további karaktereket ne vegye figyelembe és ne változtassa meg a sorrendet (-s opció), ezután minden egyforma első mezős sorból csak az elsőt (a korábbi HD-set) hagyjuk meg.

Eredménye:

AMC:314000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:101:34+35:72
ATV:378000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:101:5401:36
ATV Spirit:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4900:4901:38
AXN:706000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:510:501+504:56
BBC earth:706000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:491:497+493+494:150

Első blikkre az, amit szeretnél.

Igen a sort megvolt, de sajnos vannak hibák, melyeket még nem tudtam kiküszöbölni.Viszont jó lenne ha megmaradna az a HD felirat, mert akkor tudnám azt is, hogy melyek azok a sok közül.

FEM3:698000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_AUTO:601:602:53
TV2 Comedy:698000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_AUTO:901:902:68
TV2 Séf:698000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_AUTO:1001:1002:91
TV2 Kids:698000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_AUTO:1101:1102:101
Film Café:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:351:360:80
Cool TV:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:3000:801+802:60
Film+:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:900:901+902:65
TV2:370000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:201:202+203+204:20
TV4:370000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:7800:7801:50
TV2 HD:378000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:301:302+303+304:21
Film+ HD:714000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4300:4301+4302:64
Nat Geo HD:762000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:8000:8001+8002:303
National Geographic Wild HD:762000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:8100:8101+8102:304
National Geographic:770000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:251:260+262:165
Film Café HD:314000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:49:50:81
TVE:778000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:606:839:260
HGTV:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4030:4035+4036:154
ATV Spirit:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4800:4801:37
ATV Spirit HD:330000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4900:4901:38
Spíler1 TV:338000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:1201:1202:213
Spíler1 TV HD:338000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:1301:1302:217
Spíler2 TV:338000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:1401:1402:214
Spíler2 TV HD:338000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:1501:1502:218
Jocky TV:338000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:1601:1602:71
Moziverzum:338000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:1701:1702:76
Film4:346000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4001:4002:75

Itt ez a kisebb lista. Ha ezt teszem sorba, bármilyen opcióval is, zavarok jelentkeznek az erőben. 

Film+:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:900:901+902:65
Film4:346000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4001:4002:75
Film Café:362000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:351:360:80
Film Café HD:314000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:49:50:81
Film+ HD:714000000:INVERSION_AUTO:6900000:FEC_AUTO:QAM_256:4300:4301+4302:64

Itt látható a Film+ esetén. Ha most ráeresztem a tac-os megoldásomat, a FIlm Cafe HD megy a levesbe. Mivel a Film+ HD nem került a Film+ utáni sorba. A TV2-nél szintén ott az anomália. Persze a TV2 C(omedy) előrébb van mint a TV2 H(D).