2010-05-31 7 views
2

Je veux ajouter un à la dernière valeur à la fin d'une chaîne dans sed. Je pense le long des lignes deune ligne en utilisant sed et bc ensemble?

cat 0809_data.csv |sed -e 's/\([0-9]\{6\}\).*\(,[^,]*$\)/\1\2/g'| export YEARS = $(echo `grep -o '[^,]*$' + 1`|bc) 

par exemple 123456, kjhsflk, lksjgrlks, 2,8 -> 123456, 3,8

Serait-ce plus raisonnable/faisable dans awk?

Répondre

2

Cela devrait fonctionner:

years=$(awk -F, 'BEGIN{ OFS=", "} {print $1, $4+1}' 0809_data.csv) 

Il serait vraiment maladroit d'essayer d'utiliser sed et faire de l'arithmétique avec une partie du résultat. Vous devriez séparer la corde et faire le calcul et tout remettre ensemble. AWK le fait sans problème. Notez que cat n'est pas nécessaire (même en utilisant sed dans une commande similaire à celle de votre question) et il n'est probablement pas nécessaire d'exporter la variable sauf si vous appelez un autre script et que vous en avez besoin pour y accéder en tant que variable "globale". En outre, les shells calculent généralement des nombres entiers de sorte que vous n'avez pas besoin d'utiliser bc sauf si vous avez besoin de flottants.

+0

Cela a l'air génial. Je vous remercie. cat only_0809__data.csv | sed -e 's/\ ([0-9] \ {6 \} \). * \ (, [^,] * $ \)/\ 1 \ 2/g' | awk 'BEGIN {FS = ","} {OFS = ","} {print $ 1, $ 2 + 1} – Donnied

+0

@Donnied: 'OFS' devrait être dans le premier ensemble d'accolades (celles qui appartiennent à' BEGIN') donc il est seulement exécuté une fois au lieu de chaque ligne. Il n'est pas nécessaire d'utiliser 'cat'. Vous pouvez faire les choses regex dans le même appel à AWK, en utilisant 'gsub' peut-être, au lieu d'utiliser' sed'. –

Questions connexes