1
votes

Comment joindre des lignes en utilisant un espace et une virgule

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


0 commentaires

6 Réponses :


0
votes

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


0 commentaires

0
votes

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


2 commentaires

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.



2
votes

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"


1 commentaires

Ou, pour un plus drôle: IFS =, eval 'str = "$ {lines [0]} $ {lines [*]: 1}"'; echo "$ str" .



2
votes

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"


0 commentaires

0
votes

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
$


0 commentaires

2
votes

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 -character. L'option -s le fait différemment. Il indique de coller chaque ligne des fichiers séquentiellement avec un caractère comme délimiteur. Lorsque vous utilisez l'indicateur -d , vous pouvez donner une liste de délimiteurs à utiliser à la place du -character. Ici, j'ai donné comme liste "," indiquant, utilisez un espace et ensuite seulement des virgules.


0 commentaires