Nous allons Essayer de mettre en Œuvre sed commande
Considérons un exemple de fichier CSV avec le contenu suivant:
$ cat file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
- Pour supprimer la 1re ou de la colonne :
$ sed 's/[^,]*,//' file
25,11
31,2
21,3
45,4
12,5
Cette expression régulière recherches pour une séquence de non-virgule([^,]*) les personnages et les supprime ce qui entraîne dans le 1er champ d'obtenir supprimé.
- Pour imprimer uniquement le dernier champ, OU supprimer tous les champs sauf le dernier champ:
$ sed 's/.*,//' file
11
2
3
4
5
Cette regex supprime tout jusqu'à la dernière virgule(.*,) qui entraîne la suppression de tous les champs sauf le dernier champ.
- Pour imprimer uniquement le 1er champ:
$ sed 's/,.*//' file
Solaris
Ubuntu
Fedora
LinuxMint
RedHat
Cette regex(,.*) supprime les caractères à partir du 1er virgule jusqu'à la fin entraînant la suppression de tous les champs sauf le dernier champ.
- Pour supprimer le 2ème champ:
$ sed 's/,[^,]*,/,/' file
Solaris,11
Ubuntu,2
Fedora,3
LinuxMint,4
RedHat,5
La regex (,[^,]*,) recherche d'une virgule et de la séquence de caractères suivie d'une virgule qui résultats dans la correspondance de la 2ème colonne, et qui remplace ce modèle associé à une virgule, terminant finalement à la suppression de la 2ème colonne.
Remarque: Pour supprimer les champs dans le milieu devient de plus en plus tendue dans sed, car chaque champ doit correspondre à la lettre.
- Pour imprimer uniquement le 2e champ:
$ sed 's/[^,]*,\([^,]*\).*/\1/' file
25
31
21
45
12
L'expression régulière correspond à la première zone, le deuxième champ et le reste, cependant, des groupes de la 2ème seul domaine. L'ensemble de la ligne est maintenant remplacé par le 2e champ(\1), donc seul le 2ème champ est affiché.
- Imprimer uniquement les lignes dont la dernière colonne est un seul chiffre:
$ sed -n '/.*,[0-9]$/p' file
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
La regex (,[0-9]$) vérifie la présence d'un seul chiffre dans le dernier champ et de la commande p imprime la ligne qui correspond à cette condition.
- Au nombre de toutes les lignes dans le fichier:
$ sed = file | sed 'N;s/\n/ /'
1 Solaris,25,11
2 Ubuntu,31,2
3 Fedora,21,3
4 LinuxMint,45,4
5 RedHat,12,5
C'est la simulation de la cat-n de commande. awk est-il facilement à l'aide de la variable NR. Le '=' commande des sed donne le numéro de ligne de chaque ligne suivie par la ligne elle-même. Le sed de sortie est redirigée vers une autre commande sed pour rejoindre toutes les 2 lignes.
- Remplacer le dernier champ de 99 si le 1er champ est 'Ubuntu':
$ sed 's/\(Ubuntu\)\(,.*,\).*/\1\299/' file
Solaris,25,11
Ubuntu,31,99
Fedora,21,3
LinuxMint,45,4
RedHat,12,5
Cette expression correspond 'Ubuntu' et jusqu'à la fin, sauf la dernière colonne et groupes, chacun d'eux ainsi. Dans la pièce de remplacement, le 1er et le 2ème groupe avec le nouveau numéro 99 est remplacé.
- Supprimer la 2ème champ si le 1er champ est "RedHat':
$ sed 's/\(RedHat,\)[^,]*\(.*\)/\1\2/' file
Solaris,25,11
Ubuntu,31,2
Fedora,21,3
LinuxMint,45,4
RedHat,,5
Le 1er champ "RedHat", le 2ème champ et les champs restants sont regroupés, et le remplacement est effectué avec uniquement le 1er et le dernier groupe , resuting dans l'obtention de la 2ème champ supprimé.
- Pour insérer une nouvelle colonne à la fin(dernière colonne) :
$ sed 's/.*/&,A/' file
Solaris,25,11,A
Ubuntu,31,2,A
Fedora,21,3,A
LinuxMint,45,4,A
RedHat,12,5,A
La regex (.*) correspond à l'ensemble de la ligne et de la remplacer par la ligne elle-même (&) et le nouveau champ.
- Pour insérer une nouvelle colonne dans le début(1ère colonne):
$ sed 's/.*/A,&/' file
A,Solaris,25,11
A,Ubuntu,31,2
A,Fedora,21,3
A,LinuxMint,45,4
A,RedHat,12,5
Dernier exemple, la ligne appariés est suivie par la nouvelle colonne
J'espère que cela aidera. Laissez-moi savoir si vous avez besoin d'utiliser Awk ou toute autre commande.
Merci
sed -Ei "$rownum s/$newvalue/$col" file.csv
et il a jeté une erreur, mais aimeriez en savoir plus à ce sujet. Toute ressource à lire, à être utile.