Käsittelen
harrasteissani suuria tietomääriä tekstimuodossa. Tässä esittelen
joitakin Linux-komentoja, jotka olen havainnut tarpeelliseksi
harrasteissani. Seassa on kryptausta, pakkausta ja vastaavaa jota voi
toki soveltaa mihin tahansa formaattiin. Kyseessä on siistitty versio omasta muistilistastani.
Monet komennoista muokkaavat tiedostoa pysyvästi, eli jos leikit näiden
kanssa ensimmäistä kertaa, ota varmuuskopiot muokattavista tiedostoista.
• Yksittäisen tiedoston tehokas salaus (AES256)
openssl enc -aes-256-cbc -md sha512 -pbkdf2 -iter 250000 -salt -in salaamaton.7z -out salattu.enc
Vaatii openssl:n.
• Samaisen tiedoston dekryptaus
openssl enc -aes-256-cbc -d -md sha512 -pbkdf2 -iter 250000 -salt -in salattu.enc -out salaamaton.7z
• Erittäin tehokas pakkaus erityisesti tekstille (7z maksimiteholla)
7z a -mx9 paketti *
Vaatii 7-Zipin.
• Samaisen tiedoston purku
7z x paketti.7z
• Perus-tarballin purku
tar -xvzf paketti.tar.gz
• ZST-arkistojen purku
tar --zstd -xvf paketti.tar.zst
• Tiedoston pilkonta ilman pakkaamista
7z a -mx0 -v7g pilkottu isotiedosto.txt
Tämä tekisi esimerkiksi 13 gigatavun tiedostosta 2
tiedostoa, jotka ovat kooltaan 7 ja 6 gigatavua ja jotka voidaan purkaa takaisin
yhdeksi. Saman voi toki tehdä split-komennolla, mutta tämä on helpompi tapa.
• Samaisen osiin pilkotun paketin kokoaminen kasaan
7z x pilkottu.7z.001
Kaikkien paketin osien tulee olla samassa kansiossa.
• Tiedoston jako 50 000 rivin pätkiin (osa1.txt, osa2.txt jne)
split -l 50000 --numeric-suffixes --additional-suffix=".txt" isotiedosto.txt osa
• Tiedoston jako 400 kilotavun pätkiin, suorittaa jaon (valitettavasti) myös kesken rivin
split -b 400k --numeric-suffixes --additional-suffix=".txt" isotiedosto.txt osa
• Duplikaattirivien poisto tiedostosta
awk '{if (++dup[$0] == 1) print $0;}' tiedosto1.txt > tiedosto2.txt
• Nopeampi (erilainen) duplikaattirivien poisto
sort tiedosto1.txt > tiedosto2.txt && uniq tiedosto2.txt > tiedosto3.txt && rm tiedosto2.txt
Tämä metodi toimii hyvin suurille tiedostoille tehokkaammin, mutta
järjestää myös rivit aakkosjärjestykseen eikä siksi ole aina sopiva.
• Erikoismerkkien (ä, ö ym.) muunto perusmerkkivastineekseen (a, o ym.)
iconv -f UTF-8 -t ASCII//TRANSLIT tiedosto1.txt > tiedosto2.txt
• Tekstitiedoston isojen kirjainten muunto pieniksi
tr '[:upper:]' '[:lower:]' < tiedosto1.txt > tiedosto2.txt
• Tiedoston rivien järjestäminen aakkosjärjestykseen
sort tiedosto1.txt > tiedosto2.txt
• Tiedoston rivien järjestäminen rivin pituuden mukaan
awk '{ print length, $0 }' vanha.txt | sort -n | cut -d' ' -f2- > uusi.txt
• Erikoismerkkien melko toimiva poisto (ei siis korvaaminen) kansion tiedostojen nimistä
for file in *; do mv "$file" $(echo "$file" | sed -e 's/[^A-Za-z0-9.-]//g'); done &
• Viivalla alkavien tiedostojen siirto toisaalle
find . -type f -name "-*" -exec cp {} /viivatiedostot/ \;
Viivalla alkavat tiedostonimet ovat hankalia käsiteltäviä, joten niistä
kannattaa usein hankkiutua eroon. Tämä kopioi viivalla alkavat
tiedostot viivatiedostot-kansioon, jossa viivat
voi sitten helposti poistaa tiedostonimistä graafisen käyttöliittymän omaavan Bulk Renamen
avulla.
• Samaisten tiedostojen poisto alkuperäisestä kansiostaan
find . -type f -name "-*" -exec rm {} \;
Uudelleennimeä tiedostot toisaalla Bulk Renamella viivat poistaen ja siirrä uudelleennimetyt entisten tilalle.
• Täysin päätteettömille tiedostoille päätteen antaminen (tässä esimerkissä .md-pääte)
find . -type f ! -name "*.*" -exec sh -c 'mv "$0" "$0.md"' {} \;
• Äänimerkki; kätevä shell scriptin lopussa esimerkiksi pitkän operaation päätteeksi
speaker-test -t sine -f 1000 -l 1
• Lyhyempi äänimerkki tilanteisiin, joissa piippausta joutuu kuulemaan tiheämpään
speaker-test -t sine -f 1000 -l 1 & sleep .2 && kill -9 $!
• Lynxiä hyödyntävä HTML:n muunto tekstiksi (shell script, vaatii Lynxin)
#!/usr/bin/env bash
find . -type f -name '*.htm*' | while IFS= read path
do
lynx -dump "$path" >"${path%%.htm*}.txt"
done
• Vaihtoehtoinen tapa, joka käyttää Lynxin sijasta html2textiä (shell script, vaatii html2textin)
#!/usr/bin/env bash
find . -type f -name '*.htm*' | while IFS= read path
do
html2text "$path" >"${path%%.htm*}.txt"
done
• Merkkijonon "kissa" tai "koira" etsiminen tiedostosta ja hakusanan sisältävien rivien kokoaminen toiseen tiedostoon
grep 'kissa\|koira' tiedosto1.txt > tiedosto2.txt
• Toinen, vaihtoehtoinen tapa tehdä sama
sed '/kissa\|koira/!d' tiedosto1.txt > tiedosto2.txt
• Merkkijonon "koira" muunto merkkijonoksi "kissa"
sed -i -e 's/koira/kissa/g' tiedosto.txt
• Niiden rivien poisto, jotka sisältävät merkkijonon "kissa naukuu"
sed -i '/kissa naukuu/d' tiedosto.txt
• Niiden rivien etsintä, jotka sisältävät merkkijonon ".fi", pisteen kanssa, ja kokoaminen toiseen tiedostoon
grep '\.fi' tiedosto1.txt > tiedosto2.txt
• Esim. merkkijonon ' FI ' muunto muotoon ', FI ,' ja ' CH ' muotoon ', CH ,' (käsittelee isoja kirjaimia)
sed -i 's/ \([A-Z][A-Z]\) /, \1 ,/g' tiedosto.txt
Ajoittain käytännöllinen CSV-tiedostoja tekstimuotoisista listoista laatiessa.
• Toinen variantti aiemmasta, joka sopii numeroille ja muuntaa esim. merkkijonon '5 4' muotoon '5,4' tai '3 1' muotoon '3,1'
sed -i 's/\([0-9]\) \([0-9]\)/\1,\2/g' tiedosto.txt
• Tagien poisto; muuntaa esimerkiksi json-tiedoston tekstimuodossa luettavammaksi
sed -e 's/<[^>]*>//g' tiedosto1.txt > tiedosto2.txt
• Sanan "kissa" sisältävien rivien sekä näitä edeltävien 2 rivin ja seuraavien 3 rivin sisällyttäminen koottavaan kohdetiedostoon
grep -A 2 -B 3 kissa tiedosto1.txt > tiedosto2.txt
• Tekstin väritys HTML-tagien avulla
<font color="red">Tämä teksti on punainen<font color="black">
Tämähän ei ole validia HTML:ää, mutta toimii mainiosti. Tageilla
varustettu tekstitiedosto muutetaan LibreOfficella HTML:ksi, jossa omat
alkutagit muutetaan sen jälkeen tekstieditorilla punaväritageiksi ja
lopputagit mustaväritageiksi. Tämän jälkeen tekstieditorilla muokattu
HTML-tiedosto avataan LibreOfficella ja tallennetaan esimerkiksi
RTF-muodossa. Näin tagatut sanat tai kohdat saadaan näkymään muuten
mustassa tekstissä punaisena ja siten erottumaan selvästi.
• Rekursiivinen (myös alikansioihin kohdistuva) haku, joka etsii vain
.htm -päätteisiä tiedostoja jotka sisältävät merkkijonon "kissa" ja
kokoaa näistä riveistä oman tiedoston
grep -a -r --include "*.htm" kissa > /kohdekansio/kissatiedostot.txt
Kohdetiedosto kannattaa sijoittaa toisaalla olevaan kansioon.
• Eri sanojen esiintymismäärän laskeminen tekstistä
tr ' ' '\12' <tiedosto.txt| sort | uniq -c | sort -nr > lukumaara.txt
Ennen tätä kannattaa melkein aina muuttaa tekstin kaikki kirjaimet kokonaan pieniksi.
• Niiden tiedostojen poisto, joissa on merkkijono "kissa"
grep -a -l kissa * | xargs rm
Etsii merkkijonoa, eli poistaa myös tiedostot, joissa on esimerkiksi sana "maatiaiskissanpentu".
• Niiden tiedostojen poisto, joissa on merkkijono "kissa" kirjainkoosta riippumatta
grep -a -i -l kissa * | xargs rm
Tunnistaa merkkijonot kuten "kiSSa" tai "KotiKissalauma".
• Tiedostojen, joissa on sana "kissa" kokoaminen kokonaisuudessaan yhteen,
samaan tiedostoon
grep -l "kissa" * 2>/dev/null | xargs -d '\n' cat > /kohdekansio/kissatiedostot.txt
Kohdetiedoston tulisi olla toisessa kansiossa.