Portál AbcLinuxu, 13. května 2025 19:09
#! /bin/bash input1="$1" input2="$2" while read line do if grep -e "$line" "$input2" &>/dev/null then echo "..." >/dev/null else sed -i "s#$line#!$line#g" "$input1" "$input2" fi done <"$input1" while read line do if grep -e "$line" "$input1" &>/dev/null then echo "..." >/dev/null else sed -i "s#$line#!$line#g" "$input2" "$input1" fi done <"$input2"Jenze takovych souboru, potrebuju naraz zpracovat stovky. Dejme tomu, ze mam skript v adresari, kde jsou jenom ty .txt soubory. Chtel bych skript spustit tak, aby si vzal prvni dva soubory, zpracoval je, pak si vzal dalsi dva, dalsi dva atd. az by zpracoval o dvojicich vsechny soubory z adresare. SOubory jsou pojemnovany takto:
01.txt.identifikacnicislo, 01.txt.jineidentifikacnicislo, 02.txt.identifikacnicislo, 03.txt.ID ...Budu rad za jakoukoliv pomoc. Diky,
Řešení dotazu:
ls -1 | sort -n | head -2
ale, v praxi to bude vyzerať inak.
sort $input1 $input1 $input2 | uniq -u >only2Následně s klidem používáš řádky coby regulární výrazy. To samozřejmě nebude dělat to, co má, když budou obsahovat znaky, které mají v regexpu speciální význam, je zapotřebí je oescapovat. Přitom se rovnou mohou upravit na regulární výrazy pro úpravu input1
sed -i 's#[...]#\\\0#g;s#.*#s/^\0$/!\\0/#' only2 ^^^ sem přijde seznam těch speciálních znakůA pak se už akorát input1 upraví pomocí only2
sed -i -f only2 $input1Tvůj skript provádí vždy modifikaci input1 i input2, ale když input2 ten řádek neobsahuje, tak není co modifikovat a toto je reundantní -- pokud jsem pochopil správně, co to má dělat, možná by nebylo na škodu to popsat i slovně. Analogicky křížem. V tomto ohledu by mi přišlo přirozenější nejdřív vygenerovat skripty v sedu only2 a only1, pak je teprve použít na příslušné soubory. Ale možná úloha vyžaduje aby výsledek zpracování závisel na tom, co s křížovým souborem provedlo v prním kroku... Opět by to vyjasnil slovní popis.
sort $input1 $input1 $input2 | uniq -u >only2vyresil muj problem. Nijak nevidim, jak by si tento prikaz bral z adresare postupne dva a dva soubory za sebou atakdale az by projel cely adresar...Nebo mi neco unika.. nejsem v bashi zbehly. V promennych input1 a input2 jsou preci jmena dvou soboru, ktere skriptu zadam:
./compare.sh soubor1 soubor2Ale ty jmena souboru mu zadam ja rucne na vstupu z commandlajny. A ja potrebuju to zadavani zautomatizovat tak, jak jsem popsal vyse. Ja bych potreboval asi nejaky regexp, ktery by skriptu jako parametry postupne prirazoval prvni dva soubory z adresare, pak dalsi dva soubory atd. rozumis. Jinak v souborech nejsou redundantni radky (to je osetrene jinym skriptem uz). Cili na vstupu se predpokladaji dva txt soubory, na stejnych radcich maji stejne vety a ty se porovnavaji, resp se hledaji preklepy. pokud se njde nesrovnalost, skript v obou souborech oznaci zacatek prislusneho radku vykricnikem. Tim oznaci ze vetu nejsou stejne.
compare.sh
použít diff
?
#!/bin/sh while test "$#" -gt 0; do diff "$1" "$2" shift 2 done
#!/bin/sh while test "$#" -gt 0; do compare.sh "$1" "$2" shift 2 doneJinak
compare.sh
si můžeš nadefinovat i jako funkci. Tím se to dost urychlí.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.