Couper la colonne à longueur fixe dans un fichier sous Unix

Mon fichier contient une donnée au format suivant. Les troisième et quasortingème champs sont la date. Je souhaite conserver uniquement la partie date de ces champs et supprimer la partie heure. La deuxième fraction est toujours “0,0Z”.

Consortingbution:

1,2,2012-04-11T00:06:52.0Z,2012-04-11T00:06:52.0Z 

Sortie:

 1,2,2012-04-11,2012-04-11 

Merci Jitendra

Vous pouvez utiliser sed comme ceci:

 sed 's/T[^,]*//g' file 

Ou avec awk :

 awk '{ gsub(/T[^,]*/,"") }1' file 

Ou si les deux premiers champs peuvent contenir la lettre ‘T’:

 sed 's/\([^,]*,[^,]*,[^T]*\)[^,]*\([^T]*\).*/\1\2/' file 

Ou avec awk :

 awk -F, '{ sub(/T.*/,"",$3); sub(/T.*/,"",$4) }1' OFS=, file.txt 

Résultats:

 1,2,2012-04-11,2012-04-11 

Utiliser sed :

 sed 's/T[^,]*//g' input_file 

Sortie:

 1,2,2012-04-11,2012-04-11 

Une possibilité est d’utiliser perl pour résoudre ce problème si cela est disponible dans votre environnement.

 perl -pe 's/^(\d+),(\d+),(.*)T.*,(.*)T.*/\1,\2,\3,\4/' < yourfile 

Les deux premiers champs pouvant contenir T , awk devrait être un meilleur choix que sed :

 awk -F, '{sub("T.*","",$3); sub("T.*","",$4); print}' OFS=, input_file 
 perl -F, -ane '$F[3]=~s/T.*//g;$F[2]=~s/T[^,]*//g;print join ",",@F;' your_file 

J’utiliserais les deux virgules et “T” comme séparateurs de champs. Ensuite, $4 et $6 sont les champs de temps. Vous pouvez ensuite supprimer les champs que vous ne voulez pas

 awk -F '[,T]' -v OFS=, '{print $1,$2,$3,$5}'