2017-08-14 3 views
0

Mon fichier:Sed sur les lignes correspondant à un nombre donné de caractère spécifique

Nicole,Foo,senior,Lexington 
John,Doe,junior,Chicago 
John,Fool,True,junior,Detroit 
Lara,True,Fool,senior,Miami 

Ce que je voudrais: enlever la deuxième virgule dans la ligne quand il y a quatre au lieu de trois virgules, comme ceci:

Nicole,Foo,senior,Lexington 
John,Doe,junior,Chicago 
John,Fool True,junior,Detroit 
Lara,True Fool,senior,Miami 

Ce que j'essayé:

Pour détecter les lignes avec quatre virgules:

awk -F, '{print NF-1; next; print $0}' myfile 

Pour enlever la deuxième virgule dans une ligne:

sed 's/,/ /2' myfile 

Ce que je ne peux toujours pas faire: combiner ces deux commandes et appliquent la commande sed uniquement aux lignes avec 4 virgules. Je pense que cela pourrait être fait avec xargs mais je ne sais pas comment le gérer avec une telle déclaration conditionnelle.

Peut-être que quelqu'un pourrait me donner une direction?

Répondre

1

Essayez ceci:

sed '/\([^,]*,\)\{4\}/s/,/ /2' file 

Lorsque 4 séquences de chaîne non virgule suivie par une virgule sont trouvés, remplacer par des virgules secondes avec un espace.

0

En awk (j'utiliser sed pour celui-ci):

$ awk ' 
BEGIN { FS=OFS="," }    # separators 
NF==5 {       # for five-fielded records 
    for(i=2;i<NF;i++)    # starting from the second 
     $i=(i==2?$i " ":"") $(i+1) # append or replace with the next field 
    NF=4       # reduce the field count for those records 
}1' file 
Nicole,Foo,senior,Lexington 
John,Doe,junior,Chicago 
John,Fool True,junior,Detroit 
Lara,True Fool,senior,Miami 
0

Essayez aussi awk suivante:

awk -F, '{for(i=1;i<=NF;i++){if(NF>4){if(i==2){$i=$i " "$(i+1)};if(i==3){continue}};printf("%s%s",$i,i==NF?"":",");}print ""}' Input_file 

OU

awk -F, '{ 
for(i=1;i<=NF;i++){ 
    if(NF>4){ 
    if(i==2){ 
    $i=$i " "$(i+1) 
    }; 
    if(i==3){ 
    continue 
    } 
    }; 
    printf("%s%s",$i,i==NF?"":","); 
    } 
    print "" 
}' Input_file 
0
gawk '/Fool,|True,/{$0=gensub(/,/," ",2)}1' file 

Nicole,Foo,senior,Lexington 
John,Doe,junior,Chicago 
John,Fool True,junior,Detroit 
Lara,True Fool,senior,Miami