Je suis bloqué sur la façon de supprimer les lignes plus récentes que la date indiquée. Voici un extrait du contenu d'un fichier.
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 plus récentes que le 03/12/2013 en ne laissant que
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
Comment cela peut-il se faire via bash?
bash
text-processing
Jason G
la source
la source
Ces dates trient le même lexicographiquement et chronologiquement, il ne s'agit donc que de faire une comparaison lexicale:
la source
Je suppose que le
<br>
dans votre question à la fin de ladate
colonne est quelque chose de indésirable. Dans tous les cas, il peut être retiré facilement s'il est présent. Cependant, en venant à la partie principale, vous pouvez réaliser ce que vous essayez de faire en utilisant,Maintenant, la commande ci-dessus donnerait la sortie d'une manière triée. Maintenant, la commande ci-dessous devrait donner ce que vous recherchez.
Explication
La commande sort trie essentiellement le fichier en fonction de la deuxième colonne qui est la date. J'ai donc modifié votre fichier d'entrée pour tester la commande si elle fonctionne puisque le fichier d'entrée a toutes les données triées par défaut. Après cela, la
awk
commande imprime toutes les lignes jusqu'à ce que nous rencontrions une correspondance particulière.Essai
Maintenant, la
sort -k 2n filename.txt
sortie est,Nous sommes maintenant convaincus que le fichier est trié sur la deuxième colonne. Maintenant, pour sélectionner des valeurs JUSQU'À une date particulière,
Dans l'exemple ci-dessus, j'obtiens toutes les valeurs jusqu'à
2013/12/03
. La sortie est,Non,
<br>
ça fait partie de mon dossierSi tel est le cas, nous pouvons modifier légèrement la commande comme ci-dessous.
Je supprime donc toutes les
<br>
balises de la deuxième colonne, puis je passe la commande mentionnée ci-dessus.Références
https://unix.stackexchange.com/a/11323/47538
https://unix.stackexchange.com/a/83069/47538
la source
Solution rapide et sale pour la seule date que vous avez donnée, supprimez simplement toutes les lignes avec sed, qui correspondent à des dates postérieures à cette date:
Le -i "" remplace directement l'intérieur du fichier et ne crée pas de sauvegarde, mais vous pouvez également diriger le fichier de test via les 3 commandes sed sans le -i "".
En fonction de votre système (linux ou mac), vous pouvez annuler le "" après -i et parfois vous avez besoin du paramètre -e pour les expressions régulières. Je dois essayer ce qui fonctionne pour vous.
Question connexe avec plus d'informations sur sed: /programming/5410757/
la source
#
est la commande commentsed
, donc ceux-ci ne feront rien. Utilisezsed '\#patter#d'
si vous souhaitez un délimiteur RE différent de/
. La[0-9]*
pièce est redondante sans^
ancrage.-e
n'est nécessaire que lorsque vous souhaitez transmettre plusieurs expressions. linux est un noyau, mac est une marque informatique, aucun n'a rien à voir avecsed
. La distinction est entre GNUsed
et FreeBSDsed
(dont OS / X (comme sur certains macs) ont hérité).