Szkriptek: Python, Perl, Bash, ...

sort és awk [megoldva]

Sziasztok.

Adott egy söveges fie, melyben a sorokban vessző a mezőelválasztó (,).
Awk megmondja ugyan, hogy a 6. mezőnek milyen szám a tartalma, de kérdésem az,van-e az awk-nak olyan elvetemült kapcsolója, ami a BASH "sort -n" parancsát helyettesíti?

Azt szeretném, hogy a 6. oszlopban szereplő szám szerint csökkenő sorrendben íródjon ki a szöveges file tartalma.
Meg tudom oldani sok sorral a scriptet, de nem bírom elképzelni, hogy az awk ne tudna ilyesmit. A szöveges file közel 900 MB, sokat javítana a helyzeten, ha kisebb lenne a feldolgozó script.

Kösz minden tanácsot

[megoldva] find furcsaság

Valamit nem értek. Persze lehet, hogy csak nem veszek észre valami triviálisat, ha erről lenne szó, írjátok meg! Köszi.

Feladat: ki akartam válogatni a mentéseimből a videókat, amik egy adott dátum után készültek.

Több iteráción keresztül eljutottam oda, hogy azonosítottam azokat a fájl kiterjesztéseket, amik nem képek, nem egyebek, hanem vagy videó, vagy nem ismerem és akár videó is lehet.

Megszámoltam, hány ilyen van (1):

$ find -L /mnt/nas/backup/Pictures/ -iname *.3gp -o -iname *.amr -o -iname *.m4a -o -iname *.mov -o -iname *.avi -o -iname *.mp4 -type f -newermt 2013-11-15 | wc -l
834

OK, gondoltam legyűjtöm ezeket egy helyre, hogy ne kelljen mindig a finddal vacakolni (2):

$ find -L /mnt/nas/backup/Pictures/ -iname *.3gp -o -iname *.amr -o -iname *.m4a -o -iname *.mov -o -iname *.avi -o -iname *.mp4 -type f -newermt 2013-11-15 -print -exec ln -s '{}' . \;

A könyvtárban viszont ennél jóval kevesebb fájl lett:

$ ls -1 | wc -l
348

Na, gondoltam, bizonyára voltak duplikációk, nem tudta ugyanazt a symlinket használni többször azonos nevű fájlokhoz, stb.
Jó, gondoltam, lementem a fájl listát, basename | sort | uniq és meglátjuk, hogy jó eredmény jön-e ki, vagy van olyan, ami valami más miatt maradt le. (3)

$ find -L /mnt/nas/backup/Pictures/ -iname *.3gp -o -iname *.amr -o -iname *.m4a -o -iname *.mov -o -iname *.avi -o -iname *.mp4 -type f -newermt 2013-11-15 -print > filelistln-s.txt
$ wc -l filelistln-s.txt
348 filelistln-s.txt

Izé. Itt elakadtam.
Ha jól látom, a két parancs (1), ami 834-et ad, és (2) meg (3), ami 348-at ad, ugyanazokat a válogatási paramétereket adja a findnak, csak a -print az eltérés.

Nézzük, mit mond a man find:

If no expression is given, the expression -print is used
...
-print True; print the full file name on the standard output, followed by a newline.

Szóval elméletileg a -print megadása az utasítás végén az égvilágon semmit nem változtat, ha nem adom meg, akkor is ugyanúgy végrehajtja.

(a problémámat a két különböző fájl lista összehasonlításával tudom egyébként kezelni, szóval ez nem akadályoz, csak elgondolkoztatott).

Viszont tovább nézve a fájlok különbségét, feltűnt, hogy a 834 darabosban számos olyan fájl van, ami a megadott dátum előtti. A 348-asban nem találtam egyet se (szemmel átfutva).
Nem tudom még, hogy ez-e az egyetlen különbség, de ez megint felvet egy kérdést:

Ha a két esetben a find-nak átadott paraméterlista ugyanaz, akkor miért lehet eltérés az eredményben?
Azt írja a man, hogy operátorok (pl. -o és -a) kapcsolják össze a kifejezés elemeit, és ha hiányzik az operátor, akkor logikai és kapcsolatot feltételez.
Ez alapján a -newerXY elem és kapcsolatban van a többivel, szóval nem értem, hogy találhatott a find olyasmit, ami korábbi.
És máskor meg ügyesen kihagyja ezeket.

Metakarakter beszúrás adott pozícióba parancssorsból

Adott egy file, benne több száz sor, változó hosszúságú hexadecimális string-el.
Hogy lehet a legegyszerűbben megoldani parancssorból, hogy adott pozícióba - konkrétan a 41. - beszúrjak egy metakaraktert?

input file.txt részlet:
f543ec4182900ab972ad2bf552008eafb3734a36bae914ac5e3e57f27aa323368
5c0ad0579061fd839db877c2c7c854c57fb759ba9ec05f72cc619feafdf2f602c

output:
f543ec4182900ab972ad2bf552008eafb3734a36:bae914ac5e3e57f27aa323368
5c0ad0579061fd839db877c2c7c854c57fb759ba9e:c05f72cc619feafdf2f602c

Köszönöm.

awk - delete metacharacter from a file

Mi a rossz az alábbi parancsban?
Szeretném törölni a backslash karaktert a file-okból "awk"-t használva. gsub függvényt használnám erre a célra. Ha más módon is lehet, megköszönöm a segítséget.

file.txt tartalom részlet:
$P$DuOxmeTb7uGqNkkzenh6BqBu5OmpDF\/
$P$DPUN9ULZv9ICq.o53w4Kk\/685Q7mdW0
$P$DbHTs7pYRbB4s5sHzXh\/JK7kFa4SIT0

kívánt output:
$P$DuOxmeTb7uGqNkkzenh6BqBu5OmpDF/
$P$DPUN9ULZv9ICq.o53w4Kk/685Q7mdW0
$P$DbHTs7pYRbB4s5sHzXh/JK7kFa4SIT0

command:
awk '{gsub ("\\", ""); print $0}' file
or
awk '{gsub ("'\'", ""); print $0}' file

"Sed"-et vagy "tr"-t használva működik:
tr -d "\\" sed -E 's/\\\//\//g' file

Köszönöm.

Bash / LANGUAGE=hu nem működik

Ubuntu 16, egy idő óta nem megy a címben jelölt dolog, vagyis hogy a LANGUAGE környezeti változóval döntsem el hogy milyen nyelvű felülettel induljon egy program. Régebben ment.

Az alábbi trükközések sem segítenek:

LANG="hu_HU.UTF-8" firefox
LC_ALL="hu_HU.UTF-8" firefox

locale-gen parancs kimenete:

Generating locales (this might take a while)...
en_US.UTF-8... done
hu_HU.UTF-8... done
Generation complete.

Szeretnék néha magyarul, néha angolul indítani programokat (amiknek le van telepítve természetesen az adott nyelvű lokálja). Tisztán emlékszem hogy használtam a címben megadott módon régebben, viszont azt nem tudom hogy az még 14-es Ubuntun volt-e.


$ env | grep -i shell
SHELL=/bin/bash

$ env | grep -i lang
LANG=en_US.UTF-8
GDM_LANG=en_US
LANGUAGE=en_US

Ötlet?

Pendrive duplikalas

Sziasztok!

Az utobbi idoben megszaporodott az ugyanolyan tartalom sok pendrivera valo kiirasa az ugyfeleink reszere. Ez altalaban azt jelenti, hogy 20-30 pendrivera kell egy 10+Gb-os filet vagy fileokat kiirni. Gondolkodtam, hogy veszek egy 10-16 portos USB3-as HUB-ot es egyszerre irok legalabb tobbet. Viszont a software-es kivitelezesnel elakadtam. Nem nagyon talalok ra kesz megoldast.
Elsosorban osx kornyezetben erdekelne, de legalabb osx terminalban valo eszkozkeszlettel.
Feladat: mondjuk fel van bokve 16 pendrive. Ezeket egyszerre le kene formazni, EXFat-ra, ugyanolyan Volume nevvel. Utana pedig a forras file(okat) egyszerre felmasolni rajuk.
Ilyenekkel kiserleteztem ez mukodik is, de vmi szofisztikaltabb megoldas lehet elegansabb lenne :)

echo | xargs -n 1 cp

esetleg rsyncel ciklusban?

#!/bin/bash
for drive in /Volumes/*USB* ; do
echo rsync "$drive" &
done
wait

Ti hogy allnatok neki? Elore is koszonom az otleteket!

Bash kezdő

Sziasztok,

Van az alábbi scriptem:
https://pastebin.com/C19QWMEc

Úgy ahogy működik is, viszont van egy idegesitő hibája.

Ha a nemet választom, akkor nincs semmi gond:
neut@preshaz:/var/spool/MailScanner/quarantine/test# ./test.sh
I found 112 spams
Size of spams: 1.1M total
Do you want to delete ALL spams? [Yes/No] n
We didn't delete anything

neut@preshaz:/var/spool/MailScanner/quarantine/test# ./test.sh
I found 112 spams
Size of spams: 1.1M total
Do you want to delete ALL spams? [Yes/No] y
find: `./20170101/spam/7C2FCAC131.AAA20': No such file or directory
find: `./20170101/spam/C2320AC131.AA724': No such file or directory
find: `./20170101/spam/F1D18AC130.A9D80': No such file or directory
find: `./20170101/spam/968BCABFFB.A3419': No such file or directory
find: `./20170101/spam/7E0BAAC131.AFA06': No such file or directory
find: `./20170101/spam/1EFDBAC131.AFE16': No such file or directory
find: `./20170101/spam/8F6C3ABFFB.A2A7D': No such file or directory
find: `./20170101/spam/4756AAC131.AABF0': No such file or directory
find: `./20170101/spam/CCD4DAC131.A9992': No such file or directory
find: `./20170101/spam/A2EE9AC135.A9692': No such file or directory
find: `./20170101/spam/539B9AC131.AB474': No such file or directory
find: `./20170101/spam/2607DAC131.A8FA3': No such file or directory
find: `./20170101/spam/94448AC131.AD8F1': No such file or directory
find: `./20170101/spam/D2823AC131.AE86E': No such file or directory
Spams executed

A törlés lefut csak dobja a find az error-t.... A furcsasága hogy csak az első mappa összes elemére dobja ezt a hibát. Mit rontottam el?

Köszi.

awk - tolower toupper metódus használata

Most láttam, hogy awk-nak van kis/nagybetű konverzóra beépített metódusa.
Valamit elrontok viszont, mert szintaktikai hibával kilép...

pl. a marks.txt file tartalmát szeretném átkonvertálni nagybetűssé

marks.txt:
1) amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89

command: awk '{toupper; print $0}' marks.txt
awk: cmd. line:1: {toupper; print $0}
awk: cmd. line:1: ^ syntax error

sed command - segítség kérés

Sed használatát gyakorlom.
A file "nevek.txt" tartalma:

1, George Washington, 1984, 1345
2, John Adams, 1234, 4321,
3, Thomas Jefferson, 1022, 1230
....

A kimenetre ezt szeretném:

1, Washington George
2, Adams John
.....

Ez a parancs valamiért nem működik:

"sed -r 's/^([0-9]{1,2}), ([\w .]+?) ([\w ]+?), ([0-9]{1,4}),/\1\3\2/' nevek.txt"

Tudtok segíteni?