hova tűnik a soremelés?

van két kis parancslista, mindkettő egy-egy listát készít.

ha így csinálom:
/bin/ls -1 RexStats*.txt 2>/dev/null | sed "s/RexStats.*_\(.*\)\.txt/\1/" > landing.ls
/bin/ls -1 ../arc/rex > archive.ls

akkor wc -l landing.ls archive.ls
28 landing.ls
3 archive.ls

egyébként így néz ki:
$ cat archive.ls
20100924
20100930
20101001

Arra gondoltam, felesleges átmeneti fájlba kiírnom ezeket, majd beleteszem változóba. Így próbáltam:
ARCHIVE=$(/bin/ls -1 ../arc/rex)

Csakhogy így nincs már soremelés:
$ echo $ARCHIVE
20100924 20100930 20101001

és persze ez nekem nem jó. Tud egyáltalán a változó soremelést tartalmazni? Ha igen, akkor miért nem történik az, amit elképzeltem?

Lehet máshogy? (e kettőt utána sort és uniq dolgozná fel, aztán meg egy harmadikkal diff a közös eredményről)

G

Hozzászólások

echo $ARCHIVE | tr -s " " "\n"

talán segíthet a dolgon? nem teszteltem

Tud egyáltalán a változó soremelést tartalmazni?

Igen, de a $() (más néven ``) sajnos lecsípi az érték legvégéről az összes newline-t.

Ez marhaság. Mint az a példából egyértelműen látszik, senki nem csíp le semmit, csak nem echo $a, hanem echo "$a" formában kellene írni, és akkor látszana is az a sorvégjel.

Kornkétan az a lényeg, hogy a shell IFS nevű változója (ez tartalmazza a szavakra tördelésnél alkalmazott elválasztójeleket) alapértelmezetten ezt a három karaktert tartalmazza: szóköz, tabulátor, és soremelés karakter.


( /bin/ls -1 .... ; /bin/ls -1 .... ) | wc -l

és persze echo $ARCHIVE meg echo "$ARCHIVE" nem ugyanaz

Tartalmazza az a soremelést, csak a megjelenítésnél gyász (tudtommal). Írányítsd bele fájlba és meglátod (mármint az eredményt), ahogy eddig is csináltad. Jah és miért nem ``-t használsz?
----
Hülye pelikán


wc -w

ha úgyis csak szavakat számolsz.

Miért nem adod oda a "sort -u" -nak a listákat direktben?

még annyit, hogy a diff-hez talán mégis jobb fájl input-ot adni, viszont nem szükséges a lemez-hez nyúlni, az osztott memóriába irányítanám:


FILE1=$(mktemp /dev/shm/XXXXXX)
FILE2=$(mktemp /dev/shm/XXXXXX)
trap "{ rm -f "$FILE1" "$FILE2"; exit; }" 0 1 2 3 5 15

valami > "$FILE1"
...

diff "$FILE1" "$FILE2"

most néztem, ha dupla idézőjelet használsz, akkor az echo-nál is meg lesznek a newline karakterek (ahogy feljebb is írták):


VAR=$(seq 1 10); echo "$VAR"

más: sed "s/RexStats.*_\(.*\)\.txt/\1/" RexStats*.txt > landing.ls nem?

Majd jön Zahy mester és egy awk sorral megoldja az egészet :-)

--
falura elmegy, városban meg úgy sem nézik...

diff <(ls -1 ../arc/rex|sort) <(ls -1 RexStats*.txt 2>/dev/null | sed "s/RexStats.*_\(.*\)\.txt/\1/"|sort|uniq)