Ami ki van vágva, az ki van vágva!

Egészen véletlenül nem kellene ennek a kettőnek különböző eredményt adnia? Vagy én jöttem Tükörországból?

cut -b31-49 log.txt
55055004,2020-05-03
55055004,2020-05-03
cut -b40-49,31-39 log.txt
55055004,2020-05-03
55055004,2020-05-03

Na, ilyen egyszerű és kézenfekvő


paste -d',' <(cut -b40-49 log.txt) <(cut -b31-38 log.txt)

Hozzászólások

Szerkesztve: 2020. 05. 12., k - 08:49

Nem, a cut nem rendezi át a sorrendet, sőt nem is duplikálja a kimeneten a bemenet tartalmát, tehát egy echo "123456789 | cut -b3-6,2-5" kimenete 23456 lesz, nem pedig 34562345. Egyébként nem te vagy az első (és vélhetőleg nem is az utolsó) , akivel ez az első körben nem igazán logikus működés szembe jött ;-)

Szerkesztve: 2020. 05. 11., h - 22:35

Elég elolvasni a cut specifikációját, hogy lássuk, nem, nem kell különböző eredményt adnia.

https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cut.html

The elements in list can be repeated, can overlap, and can be specified in any order, but the bytes, characters, or fields selected shall be written in the order of the input data. 

A cut sermmi más, mint egy szűrő, ami eldönti a bemenet minden egyes byte-járól, karakteréről, vagy mezőjéről, hogy a kimenetre el kell-e küldeni, semmi mást nem csinál. Csak szűrsz a bemenetről, de nem rendezed át, nem csinálsz vele semmit. Csak eldöntöd, hogy kírjad-e vagy nem.

Pont emiatt lehet bármilyen sorrend, átfedés és ismétlődés a szűrési specifikációban, az csak azt definiálja, hogy mely bemeneti bájtot, karaktert, mezőt kell figyelembe venni, semmi mást.

Köszönet mindnyájatoknak! (bár a háromból az egyik hozzászólást kevésbé értettem, mint a másik kettőt;)

Így is lehet, talán így kicsit emészthetőbb, kézenfekvőbb:

printf "`cut -b40-49 log.txt`,`cut -b31-38 log.txt`"

1) ha bármely cut kimenetében formátumvezérlő karakterek vannak, azokat a printf lenyeli, szóval hamár, akkor inkább

printf '%s' "`cut ....`"

2) de igazából mi a francnak a printf?

cut -b40-49 log.txt ; echo -n , ; cut -b31-38 log.txt

De az eredeti felvetés pont az, hogy módosít-e a bemenő sorrenden a cut a kimenetben. Nem.

Ha csereberélni kell a bemenet részeinek a sorrendjét, akkor mondjuk awk:

$ awk 'BEGIN {OFS="," } {print substr($0,40,10), substr($0, 31,8) }' log.txt

persze onnantól kezdve, hogy awk, a log.txt sorait egyszerűbben is lehet darabolni.