Je souhaite imprimer les lignes impaires et paires à partir des fichiers.
J'ai trouvé ce script shell qui utilise l'écho.
#!/bin/bash
# Write a shell script that, given a file name as the argument will write
# the even numbered line to a file with name evenfile and odd numbered lines
# in a text file called oddfile.
# -------------------------------------------------------------------------
# Copyright (c) 2001 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------
file=$1
counter=0
eout="evenfile.$$" # even file name
oout="oddfile.$$" # odd file name
if [ $# -eq 0 ]
then
echo "$(basename $0) file"
exit 1
fi
if [ ! -f $file ]
then
echo "$file not a file"
exit 2
fi
while read line
do
# find out odd or even line number
isEvenNo=$( expr $counter % 2 )
if [ $isEvenNo -ne 0 ]
then
# even match
echo $line >> $eout
else
# odd match
echo $line >> $oout
fi
# increase counter by 1
(( counter ++ ))
done < $file
echo "Even file - $eout"
echo "Odd file - $oout"
Mais n'y a-t-il pas moyen de le faire en une seule ligne?
Oui, utilisez awk, j'ai lu.
Lignes paires:
awk 'NR % 2' filename
lignes impaires:
awk 'NR % 2 == 1' filename
Mais ça ne marche pas pour moi. Les deux produisent la même sortie, selon diff. Par rapport au fichier d'origine, ils sont tous deux en fait deux fois moins longs et contiennent tous les deux des lignes impaires. Est-ce que je fais quelque chose de mal?
NR % 2 == 0
, sinon il est équivalent au second.