J'ai le fichier qui contient du contenu comme:
IP 111 22 25
Je veux imprimer la sortie au format IP 111,22,25
.
J'ai essayé tr '',
mais ça ne marche pas
6 Réponses :
Le script awk suivant effectuera la demande:
awk ' ##Starting awk program here. BEGIN{ ##Starting BEGIN section here of awk program. OFS="," ##Setting OFS as comma, output field separator. } ##Closing BEGIN section of awk here. FNR==1{ ##Checking if line is first line then do following. first=$0 ##Creating variable first whose value is current first line. next ##next keyword is awk out of the box keyword which skips all further statements from here. } ##Closing FNR==1 BLOCK here. { ##This BLOCK will be executed for all lines apart from 1st line. val=val?val OFS $0:$0 ##Creating variable val whose values will be keep concatenating its own value. } END{ ##Mentioning awk END block here. print first FS val ##Printing variable first FS(field separator) and variable val value here. }' Input_file ##Mentioning Input_file name here which is getting processed by awk.
Explication: Ajout d'une explication pour le code ci-dessus maintenant.
awk 'BEGIN{OFS=","} FNR==1{first=$0;next} {val=val?val OFS $0:$0} END{print first FS val}' Input_file
Essayez cat file.txt | tr '\ n' ',' | sed "s / IP, / IP / g"
tr
supprime les nouvelles lignes, sed
change IP, 111,22,25
en IP 111,22,25 code>
Oh, je ne savais pas pour le sed :(. 1- Et si nous avons des adresses IP aléatoires à la place de l'IP? Comment pouvons-nous séparer IP des PORTS? 2- il imprime une virgule même après les 25 derniers ,
sed
est une recherche et un remplacement pour que vous puissiez en faire ce que vous voulez. Cela fonctionne avec regex.
En pur Bash:
IP 111,22,25
Sortie:
# Read file into array mapfile -t lines < infile # Print to string, comma-separated from second element on printf -v str '%s %s' "${lines[0]}" "$(IFS=,; echo "${lines[*]:1}")" # Print echo "$str"
Ou, pour un plus drôle: IFS =, eval 'str = "$ {lines [0]} $ {lines [*]: 1}"'; echo "$ str"
.
J'irais avec:
xargs printf "%s %s,%s,%s" < file
Cela fonctionnera également:
{ read a; read b; read c; read d; } < file echo "$a $b,$c,$d"
Utilisation de Perl
$ cat captain.txt IP 111 22 25 $ perl -0777 -ne ' @k=split(/\s+/); print $k[0]," ",join(",",@k[1..$#k]) ' captain.txt IP 111,22,25 $
Bienvenue dans coller
$ paste -sd " ," file IP 111,22,25
Normalement, ce que fait coller
, c'est qu'il écrit sur des lignes de sortie standard constituées de lignes séquentiellement correspondantes de chaque donnée fichier, séparé par un -s
le fait différemment. Il indique de coller chaque ligne des fichiers séquentiellement avec un caractère -d
, vous pouvez donner une liste de délimiteurs à utiliser à la place du ","
indiquant, utilisez un espace et ensuite seulement des virgules.