kicsit megakadtam a bash szkriptben

 ( Nextra | 2017. december 5., kedd - 0:12 )

Kinyertem a csatorna listát az mplayer konfigból így.

mplayer_channel_list="/home/$USER/.mplayer/channels.conf.cbl"
cat ${mplayer_channel_list} | awk -vFS=":" '{printf("%03d %s\n", NR, $1 ";")}'

Ez így jó is. Viszont szeretném megjeleníteni rendezett 4 oszlopos formában.

Erre két szubrutin szolgál mely meg is jeleníti, de levágja a szöveget a szóközöknél.
Vagyis

061 Spektrum
065 Nat

a Geo HD már nem látszik.

A mezőhatároló a ; karakter mert arra még talán szükség van. S mivel ez foglalt, így nem tudok megadni neki mást.
De nem is valószínű hogy azzal meglehetne oldani.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

man column
man cut
man awk -> SUBSEP

Bár ez idáig awk scriptnek tűnik. ;)

lehet az esetedben nincs jelentősége, de /home/$USER helyett $HOME arra az esetre, ha a felhasználó mappája speciális helyen volna (pl root)?

'{printf("%03d %s\n",

"
Controlling integer width with printf
The %3d specifier is used with integers, and means a minimum width of three spaces, which, by default, will be right-justified.
"

Ebben az a %03d kell (?) mert ha csak ennyi lenne hogy '%s\n' akkor ha jól értem nem lenne szóköz benne de nem kezdene új sort szóköz esetén.Itt ez a %03d ha jól értem 3 digitet írat ki jobbra zárva.

061Spektrum
065NatGeoHD

A szóközre szükség volna. Úgy mint a %03d-re. A számozás ellenkező esetben 1 2 3 11 12 13 stb. S így összeomlik a kiiratás, Magyarul, nem igazítja megfelelően a blokkokat. Bár lehet hogy van ésszerűbb vagy jobb megoldás. A column-ot még nem ismerem.


columns="4"
position="20"
IFS=$';'

loadData () {
count="1"
for sor in $(cat ${channel_list}); do
numbers[ ${count} ]=$(echo ${sor} | awk '{printf $1}')
ch_name[ ${count} ]=$(echo ${sor} | awk '{printf $2}')
((count="${count}+1"))
done
}

printMenu () {
count="1"
for channel in ${numbers[*]}; do
if [ $(echo \($count-1\) % ${columns} | bc) -eq 0 ]; then
echo
fi
name="${ch_name[${count}]}"
printf "${Yellow} ${channel} ${NC}${name}"
((POS="${position}-${#name}"))
printf "${White} \033[${POS}C"
((count="${count}"+1))
done
}

loadData
printMenu

unset IFS

Így már más a helyzet :)
Nem a legelegánsabb megoldás, de a ch_name[] legyen $0 a $2 helyett, de akkor a végén, ahol kíírod az egészet, már a ${channel}-t nem kell külön, mert ch_name[] tartalmazza
Azért jártál így, mert az awk a shellből kapja a változókat a tömbösítéskor, a shellnek pedig a space mezőelválasztó.

Elegánsabban a ch_name[.. sorban az awk-val ciklusban printeled a mezőket, 2 - NF-ig.

A lényeg az hogy a csatornák előtt lévő számoknak értékük van. Magát a csatornát jelentik. Nem elég csak kiiratni a dolgokat, hiszen a legegyszerűbb lenne a column -t channel_list. De így nem kap ch_number változót maga a szám, és ch_name változót a csatornanév.

Ezt a két változót dolgozza fel, és írja ki rendezett oszlopban a két szubtutin.

A szubrutinok lefutása után jön a kérdés, hogy melyik csatornát választod. Mondod a csatornaNÉV előtt lévő SZÁMot, mert azt könnyebb beírni, és a szám alapján megvan a név. Ezt a nevet fogom átadni majd a dumpstreamnek. (dvb-c)

De ennek a névnek meg kell egyeznie az mplayer channel listájában lévő névvel.

Nos kiötlöttem. De a színezésben még kérnék segítséget.
Szeretném ha a számsor a kiratásban sárga lenne a csatornák meg fehérek.


mplayer_channel_list="/$HOME/.mplayer/channels.conf.cbl"
cat ${mplayer_channel_list} | awk -vFS=":" '{printf("%03d %s\n", NR, $1 ";")}' > /$HOME/.dvbrip-001/dvbc_channels
channel_list="dvbc_channels"

# poziciók
columns="4"
position="30" # ha 30-nál kevesebb, akkor nem szép.

echo -e "\n Üdvözöl a ${Yellow} dvbRip ${version}"
IFS=$';' # mezőhatároló a channel.list-ben
#loadData () {
count="1"
for sor in $(cat ${channel_list}); do
numbers[ ${count} ]=$(echo ${sor} | awk '{printf $1}')
ch_name[ ${count} ]=$(echo ${sor} | awk '{printf $0}') # kiírja a teljes nevet (#claude_leon)
((count="${count}+1"))
done
}
#loadData

column ${channel_list} # gyorsabb kiiratás

echo -n "${Cyan} Válassz egy csatornát! "
read choice
name="${ch_name[10#${choice}]}" # 10# a 08, 09 oktális decimális keverés miatt.
channel="${channel[10#${choice}]}"
name=$(echo ${name/${name:0:4}}) # itt visszatörlöm a számokat s megvan az mplayer channel list név

echo -e "\n ${NC}Kiválasztott csatorna: ${Green}${name} \n"

Nos ez már működik: pastebin.com/KLjuySq8

De két dolgot szeretnék megoldani.
Az egyik az oszlopok színezése. Sárga számok, fehér nevek.
A másik meg valami visszajelzés hogy hol tart a dolog.
A mencoder kiírja hogy hány másodpercnél jár egy kódolás közben. Ez nem ír ki semmit.
De se az mpv, sem az mplayer nem ír ki a dumpolásról infót. :(

Az időzítés is már készen van at, cron, sorozat stb, de azt addig nem teszem bele meg a wakealarmot sem, míg ezeket nem tudom megoldani valahogy.
A tvheadend nem nagyon jött be. Ez tiszta, gyors, átlátható egyszerű.

S még szükségem volna egyedi initre a gép bekapcsolásakor. Amíg sysinit volt megtudtam oldani, de ez a systemd...
Ezt nem értem. Hiszen egy wakealarmos gép bekapcsolásakor, nincs szükség internetre, tűzfalra, semmi extrára ahhoz hogy a gép felvegye a műsort. Felesleges dolgokat nem töltenék be. De hogy ezt hogy adom be a systemd-nek és grub2-nek az még rejtély.

Minden segítséget elfogadok. Előre is köszi.

Azt már megoldottam hogy színesek legyenek a számok a sor elején. De ez piros lett. Hogy lehet sárga?
column dvbc_channels | grep -P '[0-9]{3,4}'
A dvbc_channels így épül fel:

$ cat dvbc_channels
001 AMC;
002 ATV HD;
003 AXN;
004 BBC earth;
005 Bloomberg TV;
006 Boomerang;
007 Cartoon Network;

Feliratkozom.

Én meg leiratkoznék.

Kiváncsi lettem volna az inputra, meg az elvárt outputra. Helyette láttam mindent, csak épp ezeket nem.
Cserébe olvashatatlan awk scripthalmazokat, amik már egy évtizeddel ezelőtt is cikinek számítottak szerintem ebben a formában.

Oké, hogy magának írja az ember, de nem árt, ha a kódnak (legyen az akár shell script is) van egy olyan váza, ami miatt ha később ránéz az ember, olvasható lesz, még akkor is, ha addigra már annak az egzotikus tool-nak, ami a kód írásakor épp a fejében volt, fejből ismerte is minden kapcsolóját, de az az idővel meg elmúlt.

Nade (többek között) ez különbözteti meg a senior meg a junior kódert.

Ha már bash a cél és nem ragaszkodsz awk mágiához...

Javaslom az inputból pár sample-sort bemásolni, és az abból elvárt output-ot is.
Úgy könnyebb segíteni is.

Érdemes a samplebe olyat is betenni, amin a mostani megoldás elakad/ nem azt csinálja, amit szeretnél. (magyarul: corner case-t)

a) tipp:
Pájpolj be egy '|tr " " "valami nem használt karakter"|'-t a cat és awk közé, a végére pedig a fordítottját.

b) tipp:
'cat $(file)|awk ' helyett esetleg 'awk -vFS=".." <$(file)'

Csak a b)-re reagálok:

awk -F X '....' "$file"

Az awk ugyanis elfogad feldolgozandó fájlnév paramétert. Ráadásul a $(file) rohadtul nem ugyanaz, mint a ${file}. A te példádban 110%, hogy az utóbbi kellene, nem az, amit te írtál.

=====
tl;dr
Egy-két mondatban leírnátok, hogy lehet ellopni egy bitcoin-t?

Igen slendrán vagyok :D