supprimer les lignes qui sont plus récentes que la date donnée dans un file

Je suis bloqué sur la façon dont je peux supprimer des lignes qui sont plus récentes que la date donnée. Voici un extrait de contenu d'un file.

buildsave.txt

647919 2013/11/30 647946 2013/11/30 647955 2013/12/01 648266 2013/12/03 648267 2013/12/03 648674 2013/12/04 

Je voudrais supprimer les lignes qui sont plus récentes que 2013/12/03 laissant seulement

 647919 2013/11/30 647946 2013/11/30 647955 2013/12/01 

Comment cela peut-il être fait par bash?

Si votre système inclut la version GNU de la command date , vous pouvez utiliser cette option pour convertir le champ de date (après avoir enlevé le dernier terme, le cas échéant) en secondes depuis l'époque et comparer directement à la date limite dans le même format , par exemple en bash

 testsecs=$(date +%s --date="2013/12/03") while IFS= read -r line; do read -rxd <<< "$line" if (( $(date +%s --date="${d%<br>}") < $testsecs )); then printf '%s\n' "$line" fi done < buildsave.txt 

[Notez que ceci n'effectue pas de suppression sur place – vous devez save les résultats dans un file temporaire et le renommer.]

Ces dates sont de même ordre lexicographique et chronologique, il ne s'agit donc que de faire une comparaison lexicale:

 awk '$2 < "2013/12/03"' 

Je suppose que la question de votre question à la fin de la colonne de date est quelque chose de non désiré. Dans tous les cas, il peut être retiré facilement s'il est présent. Cependant, venant à la partie principale, vous pouvez réaliser ce que vous essayez de faire en utilisant,

 sort -k 2n filename.txt 

Maintenant, la command ci-dessus donnerait la sortie d'une manière sortingée. Maintenant, la command ci-dessous devrait donner ce que vous searchz.

 sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

Explication

La command de sorting sortinge essentiellement le file basé sur la deuxième colonne qui est la date. J'ai donc modifié votre file d'input pour tester la command si cela fonctionne car le file d'input a toutes datatables sortingées par défaut. Après cela, la command awk imprime toutes les lignes jusqu'à ce que nous renconsortingons une correspondance particulière.

Essai

 cat filename.txt 647919 2014/01/01 647946 2012/11/30 647955 2011/01/04 648266 2013/12/03 648267 2013/12/03 648674 2013/12/04 

Maintenant, sort -k 2n filename.txt sortie sort -k 2n filename.txt ,

 647955 2011/01/04 647946 2012/11/30 648266 2013/12/03 648267 2013/12/03 648674 2013/12/04 647919 2014/01/01 

Maintenant, nous sums satisfaits que le file est sortingé sur la deuxième colonne. Maintenant, pour sélectionner des valeurs UPTO à une date particulière,

 sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

Dans l'exemple ci-dessus, j'obtiens toutes les valeurs 2013/12/03 . La sortie est,

 647955 2011/01/04 647946 2012/11/30 

Non, la <br> fait partie de mon dossier

Si c'est le cas, nous pouvons modifier légèrement la command comme ci-dessous.

 awk '{print $1, substr($2, 1, length($2)-4)}' filename.txt | sort -k 2n filename.txt | awk '/2013\/12\/03/ {exit} {print}' 

Je supprime donc toutes les balises <br> de la deuxième colonne, puis la command ci-dessus.

Les references

https://unix.stackexchange.com/a/11323/47538

https://unix.stackexchange.com/a/83069/47538

Solution rapide et sale pour la date que vous avez donnée, il suffit de supprimer toutes les lignes avec sed, qui correspondent à des dates postérieures à cette date:

 sed -i "" "#[0-9]* 2013/12/0[4-9]#d" testfile.txt sed -i "" "#[0-9]* 2013/12/[123][0-9]#d" testfile.txt sed -i "" "#[0-9]* 2014/[0-9][0-9]/[0-3][0-9]#d" testfile.txt 

Le -i "" se substitue directement à l'intérieur du file et ne crée pas de sauvegarde, mais vous pouvez également envoyer un file de test à travers les 3 commands sed sans -i "".

En fonction de votre système (linux ou mac), vous pouvez utiliser le paramètre "" après -i et parfois le paramètre -e pour les expressions régulières. Je dois essayer ce qui fonctionne pour toi.

Question connexe avec plus d'informations sur sed: https://stackoverflow.com/questions/5410757/