2017-10-11 2 views
0

j'ai données comme suitcomment insérer un séparateur chaque nième colonne en utilisant shell

11111 22222 33333 44444      55555   66666 

Je voudrais que les données de sortie comme suit

11111,22222,3333,4444      ,55555   ,66666 

J'ai essayé d'utiliser la commande tr en convertissant le espace avec des virgules, mais obtenir toutes les virgules après le 4444 OR 55555. Note: il y a beaucoup d'espaces entre 4444 et 5555. Est-il possible de remplir l'espace à la 6e, 12e, 17e, 46e, etc colonne avec une virgule?

+0

juste penser à voix haute, mais essayez de remplacer les espaces par des virgules puis après remplacer '' ,, avec '' (espace) – Dominik

+3

Voulez-vous vraiment un moins ' 3' et un de moins «4» dans la sortie? – jas

+0

Merci pour votre réponse rapide. J'ai été capable de résoudre ce problème. puisque le champ où je devais insérer une virgule était constant, j'ai utilisé plusieurs commandes sed. donc pour l'exemple ci-dessus le cmd était – Aires69

Répondre

0

Si votre fichier Input_file est identique à l'exemple illustré, le suivant peut également vous aider.

awk '{gsub(/ [0-9]+/,",&");gsub(/, /,",")} 1' Input_file 

La sortie sera la suivante.

11111,22222,33333,44444      ,55555   ,66666 

Explication de commande ci-dessus:

awk '{ 
gsub(/ [0-9]+/,",&"); ##gsub is awk utility to substitute things, so its format is gsub(regex_for_strings_to_be_replaced,with_whom_it_should_be_replaced,variable/line). So here I am substituting globally space then all digits(continuous ones) with a comma and (matched regex itself, which is space then all digits(continuous ones)). 
gsub(/, /,",")  ##Using gsub again here to replace comma then space(,) with only comma(,), to get the output into same shape in which OP has asked, it will remove space between command and digits which was created in above command. 
} 
1      ##awk works on method of condition then action, so here I am making condition as TRUE by mentioning 1 and not mentioning any action so be default print action will happen, print of current line. 
' Input_file   ##Mentioning Input_file name here. 
4

Ne serait-ce pas ce que vous cherchez? (Deviner le manque 4 dans votre sortie désirée est une faute de frappe)

sed -E 's/ ([0-9])/,\1/g' data 

(utiliser -r au lieu de -E si vous êtes sur un Mac).

+0

En fait, macOS ' sed' est basé sur une ancienne version de FreeBSD, qui supporte '-E' mais pas' -r'. FreeBSD (et d'autres BSD) ont supporté les deux options de manière équivalente pendant des années. Le '-E' est destiné à être équivalent à l'option' -E' de grep (pour RE "Extended"). Je ne suis pas sûr d'où les gens de GNU ont eu l'idée d'utiliser '-r' pour ERE. – ghoti