Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sort et première ligne

Aucune réponse
Avatar
Marc Boyer
Bonjour,

j'ai un fichier de données, avec une première ligne d'en-tête. J'aimerais
trier le fichier, sauf la première ligne. Et je ne trouve pas de façon
élégante de le faire.

Je peux supprimer la première ligne, mais je ne trouve pas de façon
élégante de la remettre ensuite... Je sais faire un script qui sauvera
dans une variable la première ligne, fera le tri, remettra la ligne,
mais bon, c'est un peu lourd...

sed 1d toto.csv | sort > toto-sorted.csv

--
À mesure que les inégalités regressent, les attentes se renforcent.
François Dubet

7 réponses

1 2 3
Avatar
Stephane Chazelas
2012-06-25 15:51:47 +0000, Nicolas George:
Stephane Chazelas , dans le message
, a écrit :
> De meme que pour "sed" et "tail", le standard le guarantit si
> "fichier" est seekable.

[citation needed]



Citation given by Jeremie up-thread.

--
Stephane
Avatar
Cyrille Lefevre
Le 25/06/2012 13:02, Stephane Chazelas a écrit :
2012-06-25 01:19:58 +0200, Cyrille Lefevre:
[...]
(read -r; printf "%sn" "$REPLY"; sort)< fichier


[...]

(IFS= read -r firstline&& printf "%sn" "$firstline"&& sort)< fich ier




Bonjour,

les && et la variable, je veux bien, mais je ne vois pas l'interrêt du
IFS= dans le cas présent :

v2$ printf '1 2 3t5 6 7' |
(read -r REPLY && printf ":%s:n" "$REPLY") | cat -vt
:1 2 3^I5 6 7:

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
jca+news
Cyrille Lefevre <cyrille.lefevre-news%
writes:

Le 25/06/2012 13:02, Stephane Chazelas a écrit :
2012-06-25 01:19:58 +0200, Cyrille Lefevre:
[...]
(read -r; printf "%sn" "$REPLY"; sort)< fichier


[...]

(IFS= read -r firstline&& printf "%sn" "$firstline"&& sort)< fichi er



Bonjour,



Bonjour.

les && et la variable, je veux bien, mais je ne vois pas l'interêt d u IFS=
dans le cas présent :

v2$ printf '1 2 3t5 6 7' |
(read -r REPLY && printf ":%s:n" "$REPLY") | cat -vt
:1 2 3^I5 6 7:



Revenons un peu en arrière.
Quand on ne passe pas de paramètre au builtin ''read'' de bash, celui- ci
met le résultat dans la variable REPLY, sans supprimer les caractà ¨res
blancs de début et de fin. De manière portable, ça s'éc rit
''IFS= read -r var''. Exemples :

$ read -r <<< " foo bar "; printf '<%s>n' "$REPLY"
< foo bar >
$ read -r REPLY <<< " foo bar "; printf '<%s>n' "$REPLY"
<foo bar>
$ read -r var <<< " foo bar "; printf '<%s>n' "$var"
<foo bar>
$ IFS= read -r var <<< " foo bar "; printf '<%s>n' "$var"
< foo bar >
$

Je pense que Stephane voulait proposer une alternative portable
à l'utilisation spécifique de REPLY. Par contre, dans ton dernier
exemple, tu utilises ''read -r REPLY; ...'', ce qui donne exactement le
même résultat que ''read -r var; ...'' (voir ci-dessus). Si tu ne voies
pas la différence, c'est que ta ligne de test ne débute ni ne fin it par
des caractères blancs présents dans IFS.

HTH
--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Avatar
Stephane Chazelas
2012-06-26 15:04:11 +0200, Jérémie Courrèges-Anglas:
Cyrille Lefevre <cyrille.lefevre-news%
writes:

> Le 25/06/2012 13:02, Stephane Chazelas a écrit :
>> 2012-06-25 01:19:58 +0200, Cyrille Lefevre:
>> [...]
>>> (read -r; printf "%sn" "$REPLY"; sort)< fichier
>> [...]
>>
>> (IFS= read -r firstline&& printf "%sn" "$firstline"&& sort)< fichier
>
> Bonjour,

Bonjour.

> les && et la variable, je veux bien, mais je ne vois pas l'interêt du IFS > > dans le cas présent :
>
> v2$ printf '1 2 3t5 6 7' |
> (read -r REPLY && printf ":%s:n" "$REPLY") | cat -vt
> :1 2 3^I5 6 7:

Revenons un peu en arrière.
Quand on ne passe pas de paramètre au builtin ''read'' de bash, celui-ci
met le résultat dans la variable REPLY, sans supprimer les caractères
blancs de début et de fin.


[...]

...et se comporte differemment de zsh ou ksh:

~$ echo $' atb c nx ' | zsh -c 'read -r; printf "%sn" "$REPLY"'
a b c
~$ echo $' atb c nx ' | ksh -c 'read -r; printf "%sn" "$REPLY"'
a b c
~$ echo $' atb c nx ' | bash -c 'read -r; printf "%sn" "$REPLY"'
a b c


~$ echo $' atb c nx ' | zsh -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ib c x$
~$ echo $' atb c nx ' | ksh -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ibx$
~$ echo $' atb c nx ' | bash -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ib c x$

(bug de ksh93?)

--
Stephane
Avatar
jca+news
Stephane Chazelas writes:

[à propos de bash...]

...et se comporte differemment de zsh ou ksh:

~$ echo $' atb c nx ' | zsh -c 'read -r; printf "%sn" "$REPLY"'
a b c
~$ echo $' atb c nx ' | ksh -c 'read -r; printf "%sn" "$REPLY"'
a b c
~$ echo $' atb c nx ' | bash -c 'read -r; printf "%sn" "$REPLY"'
a b c



Pour le coup, je trouve que le comportement de bash plus utile, même
s'il ne semble malheureusement pas documenté.

~$ echo $' atb c nx ' | zsh -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ib c x$
~$ echo $' atb c nx ' | ksh -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ibx$
~$ echo $' atb c nx ' | bash -c 'read REPLY; printf "%sn" "$REPLY" ' | cat -vte
a^Ib c x$

(bug de ksh93?)



Hmmm, bizarre, avec le ksh93 de debian squeeze, j'ai :
$ echo $' atb c nx ' | ksh93 -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ib c x$
$ echo $' atb c nx ' | bash -c 'read REPLY; printf "%sn" "$REPLY"' | cat -vte
a^Ib c x$
$

pdksh (OpenBSD), lui, se comporte comme ksh93 et zsh.

--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Avatar
Cyrille Lefevre
Le 26/06/2012 16:36, Stephane Chazelas a écrit :
2012-06-26 15:04:11 +0200, Jérémie Courrèges-Anglas:
Cyrille Lefevre<cyrille.lefevre-news%


~$ echo $' atb c nx ' | zsh -c 'read REPLY; printf "%sn" "$REPLY "' | cat -vte
a^Ib c x$
~$ echo $' atb c nx ' | ksh -c 'read REPLY; printf "%sn" "$REPLY "' | cat -vte
a^Ibx$
~$ echo $' atb c nx ' | bash -c 'read REPLY; printf "%sn" "$REPL Y"' | cat -vte
a^Ib c x$

(bug de ksh93?)



v2$ ksh93 -c 'echo ${.sh.version}'
Version JM 93u 2011-02-08
v2$ echo $' atb c nx ' | ksh93 -c 'read REPLY; printf "%sn"
"$REPLY"' | cat -vte
a^Ib c x$

v2$ /opt/ast/bin/ksh -c 'echo ${.sh.version}'
Version JM 93u+ 2012-02-14
v2$ echo $' atb c nx ' | /opt/ast/bin/ksh -c 'read REPLY; printf
"%sn" "$REPLY"' | cat -vte
a^Ibx$

surement! j'le signale sur la lite qui va bien...

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Avatar
Cyrille Lefevre
Le 26/06/2012 15:04, Jérémie Courrèges-Anglas a écrit :
Cyrille Lefevre<cyrille.lefevre-news%
writes:


[snip]
les && et la variable, je veux bien, mais je ne vois pas l'interê t du IFS=
dans le cas présent :

v2$ printf '1 2 3t5 6 7' |
(read -r REPLY&& printf ":%s:n" "$REPLY") | cat -vt
:1 2 3^I5 6 7:



Revenons un peu en arrière.
Quand on ne passe pas de paramètre au builtin ''read'' de bash, ce lui-ci
met le résultat dans la variable REPLY, sans supprimer les caractà ¨res
blancs de début et de fin. De manière portable, ça s'à ©crit
''IFS= read -r var''. Exemples :


[snip]
Je pense que Stephane voulait proposer une alternative portable
à l'utilisation spécifique de REPLY. Par contre, dans ton der nier



il y a des choses que je fais par habitude sans me souvenir du pourquoi
du ceomment pourquoi, trop fort, non ;^)
de part le passé, j'ai dû effectivement constater que read é tait
différent de read $REPLY selon tel ou tel shell sur tel ou tel OS,
ce qui fait que, dans le doute, j'utilise read -r $REPLY pour rester
"portable" vis à vis de $REPLY. pour autant, je ne me souvenais pas de
la finesse du IFS= vis à vis des espaces devant et derrière.. . à ajouter
systématiquement, donc...

exemple, tu utilises ''read -r REPLY; ...'', ce qui donne exactement le
même résultat que ''read -r var; ...'' (voir ci-dessus). Si t u ne voies
pas la différence, c'est que ta ligne de test ne débute ni ne finit par
des caractères blancs présents dans IFS.



Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
1 2 3