2017-08-29 13 views
-1

J'ai besoin de remplacer la date dans l'en-tête d'un fichier volumineux. J'ai donc plusieurs colonnes dans l'en-tête, en utilisant | (pipe) comme séparateur, comme ceci: A | B05 | 1 | xxc | 2018/06/29 | AC23 | SoOnRemplacer la colonne dans l'en-tête d'un grand fichier .txt - unix

Donc j'ai besoin du même en-tête mais avec le date (5ème colonne) mise à jour: A | B05 | 1 | xxc | 2018/08/29 | AC23

Des solutions pour moi? J'ai essayé avec awk et sed mais tous les deux m'ont porté des erreurs plus grandes que moi. Je suis nouveau à ce sujet et je veux vraiment comprendre la solution. Alors pourriez-vous m'aider s'il vous plaît?

+1

Affichez votre travail et les messages d'erreur. –

Répondre

0

Vous pouvez utiliser ci-dessous commande qui remplace 5ème colonne de chaque ligne avec le contenu de la variable newdate:

awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}{ $5 = newdate }1' infile > outfile 

Explication

awk -v newdate="2018/08/29" ' # call awk, and set variable newdate 
    BEGIN{ 
      FS=OFS="|"   # set input and output field separator 
    } 
    { 
      $5 = newdate   # assign fifth field with a content of variable newdate 
    }1       # 1 at the end does default operation 
           # print current line/row/record, that is print $0 
    ' infile > outfile 

Si vous voulez sauter la première ligne Incase Si vous avez un en-tête, utilisez FNR>1

awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR>1{ $5 = newdate }1' infile > outfile 

Si vous voulez remplacer 5ème colonne de 1er rang suffit alors d'utiliser FNR==1

awk -v newdate="2018/08/29" 'BEGIN{FS=OFS="|"}FNR==1{ $5 = newdate }1' infile > outfile 

Si vous avez encore problème, cadrer votre question avec l'entrée de l'échantillon et résultat attendu, de sorte que il sera facile d'interpréter votre problème.

+1

C'est génial. La bonne solution pour moi est la dernière et fonctionne correctement. Merci beaucoup! – Light

0

court sed solution:

sed -Ei '1s~\|[0-9]{4}/[0-9]{2}/[0-9]{2}\|~|2018/08/29|~' file 
  • -i - modifier le fichier en place

  • 1s - remplacer seulement dans la 1ère ligne

  • (en-tête)
  • [0-9]{4}/[0-9]{2}/[0-9]{2} - modèle de date

+0

Bonjour, merci pour la réponse. Lorsque j'utilise votre solution, je reçois un message d'erreur << sed: 1: "header.txt": caractères supplémentaires à la fin de la commande h >> – Light

+0

@Light, cela devrait fonctionner sous Linux. Êtes-vous sur MacOS? – RomanPerekhrest

+0

oui, j'ai fait un test sur les MacOS – Light