Remplacez à nouveau un délimiteur à un compte donné (4), avec un autre caractère

Compte tenu de cette ligne:

12,34,56,47,56,34,56,78,90,12,12,34,45 

Si le nombre de virgules (,) est supérieur à quatre, remplacez la 4ème virgule (,) par || .

Si le compte est inférieur ou égal à 4, inutile de remplacer la virgule (,).

Je suis en mesure de trouver le compte par le awk suivant:

 awk -F\, '{print NF-1}' text.txt 

alors j’ai utilisé une condition if pour vérifier si le résultat est supérieur à 4. Mais incapable de remplacer la 4ème virgule par ||

Recherchez le nombre de délimiteurs dans une ligne et remplacez la position particulière par un autre caractère.

Mettre à jour:

Je veux remplacer la virgule par || symbole après chaque 4ème occurrence de la virgule. Désolé pour la confusion.

Production attendue:

 12,34,56,47||56,34,56,78||90,12,12,34||45 

En utilisant awk, vous pouvez faire:

 s='12,34,56,47,56,34,56,78,90,12,12,34,45' awk -F, '{for (i=1; i 

Avec GNU awk pour gensub() :

 $ echo '12,34,56,47,56,34' | awk -F, 'NF>5{$0=gensub(/,/,"||",4)}1' 12,34,56,47||56,34 $ echo '12,34,56,47,56' | awk -F, 'NF>5{$0=gensub(/,/,"||",4)}1' 12,34,56,47,56 
 $ echo 12,34,56,47,56,34,56,78,90,12,12,34,45 | sed 's/,/||/4' 12,34,56,47||56,34,56,78,90,12,12,34,45 $ echo 12,34,56,47 | sed 's/,/||/4' 12,34,56,47 

Devrait fonctionner avec n’importe quel sed POSIX

Mettre à jour:

Pour la question mise à jour, vous pouvez utiliser

 $ echo 12,34,56,47,56,34,56,78,90,12,12,34,45 | sed -e 's/\(\([^,]*,\)\{3\}[^,]*\),/\1||/g' 12,34,56,47||56,34,56,78||90,12,12,34||45 

Malheureusement, la commande de POSIX sed peut prendre soit un nombre, soit un g , mais pas les deux. GNU sed permet la combinaison, mais elle ne fait pas ce que nous voulons dans ce cas. Donc, vous devez l’épeler dans l’expression régulière.

si le compte est supérieur à quatre, je veux remplacer la 4ème virgule (,) par ||

essayez cette ligne (gnu sed):

 sed -r '/([^,]*,){4}.*,/s/,/||/4' file 

tester:

 kent$ echo ",,,,,"|sed -r '/([^,]*,){4}.*,/s/,/||/4' ,,,||, kent$ echo ",,,,"|sed -r '/([^,]*,){4}.*,/s/,/||/4' ,,,, kent$ echo ",,,"|sed -r '/([^,]*,){4}.*,/s/,/||/4' ,,, 

avec awk

  awk -F, 'NF-1>4{for(i=1;i