J'étais curieux de voir comment certains d'entre eux (+ quelques alternatives) fonctionnent en termes de vitesse avec un fichier assez volumineux ( 163MiB
un IP
par ligne, ~ 13 millions de lignes):
wc -l < iplist
13144256
Résultats (avec sync; echo 3 > /proc/sys/vm/drop_caches
après chaque commande; j'ai répété les tests - dans l'ordre inverse - après quelques heures mais les différences étaient négligeables; notez également que j'utilise gnu sed
):
tournevis :
très lent. Avorté après deux minutes d'attente ... donc pas de résultat pour celui-ci.
cuonglm :
awk 'FNR!=1{print l}{l=$0};END{ORS="";print l}' ORS=' | ' iplist
real 0m3.672s
perl -pe 's/\n/ | / unless eof' iplist
real 0m12.444s
mikeserv :
paste -d\ /dev/null iplist /dev/null | paste -sd\| -
real 0m0.983s
jthill :
sed 'H;1h;$!d;x;s/\n/ | /g' iplist
real 0m4.903s
Avinash Raj :
time python2.7 -c'
import sys
with open(sys.argv[1]) as f:
print " | ".join(line.strip() for line in f)' iplist
real 0m3.434s
et
val0x00ff :
while read -r ip; do printf '%s | ' "$ip"; done < iplist
real 3m4.321s
ce qui signifie 184.321s
. Sans surprise, c'est 200 fois plus lent que la solution de mikeserv .
Voici d'autres façons d'
utiliser awk:
awk '$1=$1' RS= OFS=' | ' iplist
real 0m4.543s
awk '{printf "%s%s",sep,$0,sep=" | "} END {print ""}' iplist
real 0m5.511s
perl:
perl -ple '$\=eof()?"\n":" | "' iplist
real 0m9.646s
xargs:
xargs <iplist printf ' | %s' | cut -c4-
real 0m6.326s
une combinaison tête + pâte + tr + chat:
{ head -n -1 | paste -d' |' - /dev/null /dev/null | tr \\n \ ; cat ; } <iplist
real 0m0.991s
Si vous en avez GNU coreutils
et si votre liste d'adresses IP n'est pas vraiment énorme (disons jusqu'à 50000 adresses IP), vous pouvez également le faire avec pr
:
pr -$(wc -l infile) -tJS' | ' -W1000000 infile >outfile
où
-$(wc -l infile) # no. of columns (= with no. of lines in your file)
-t # omit page headers and trailers
-J # merge lines
-S' | ' # separate columns by STRING
-W1000000 # set page width
par exemple pour un fichier de 6 lignes:
134.28.128.0
111.245.28.0
109.245.24.0
128.27.88.0
122.245.48.0
103.44.204.0
la commande:
pr -$(wc -l <infile) -tJS' | ' -W1000 infile
les sorties:
134.28.128.0 | 111.245.28.0 | 109.245.24.0 | 128.27.88.0 | 122.245.48.0 | 103.44.204.0
tr
insérer des nouvelles lignes dans des|
tuyaux? Comme<ipfile tr \\n \| >outfile
?