Estoy atascado en cómo puedo eliminar líneas que son más nuevas que la fecha dada. Aquí hay un fragmento de contenido de un archivo.
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
Me gustaría eliminar las líneas que son más recientes que 2013/12/03 dejando solo
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
¿Cómo se puede hacer esto a través de bash?
bash
text-processing
Jason G
fuente
fuente
Esas fechas se clasifican de la misma manera lexicográfica y cronológicamente, por lo que solo es cuestión de hacer una comparación léxica:
fuente
Supongo que
<br>
en su pregunta al final de ladate
columna es algo no deseado. En cualquier caso, se puede quitar fácilmente si está presente. Sin embargo, al llegar a la parte principal, puede lograr lo que está tratando de hacer usando,Ahora, el comando anterior daría la salida de manera ordenada. Ahora, el siguiente comando debería dar lo que busca.
Explicación
El comando de clasificación básicamente ordena el archivo en función de la segunda columna, que es la fecha. Así que modifiqué su archivo de entrada para probar el comando si funciona, ya que el archivo de entrada tiene todos los datos ordenados por defecto. Después de eso, el
awk
comando imprime todas las líneas hasta que encontremos una coincidencia particular.Pruebas
Ahora, la
sort -k 2n filename.txt
salida es,Ahora estamos satisfechos de que el archivo está ordenado en la segunda columna. Ahora, para seleccionar valores HASTA una fecha particular,
En el ejemplo anterior, obtengo todos los valores hasta
2013/12/03
. La salida es,No,
<br>
es parte de mi archivoSi este es el caso, podemos ajustar el comando ligeramente como se muestra a continuación.
Así que solo estoy eliminando todas las
<br>
etiquetas de la segunda columna y luego canalizando el comando mencionado anteriormente.Referencias
https://unix.stackexchange.com/a/11323/47538
https://unix.stackexchange.com/a/83069/47538
fuente
Solución rápida y sucia para la fecha que ha dado, simplemente elimine todas las líneas con sed, que coincidan con fechas posteriores a esta fecha:
El "i" "está reemplazando directamente dentro del archivo y no está creando una copia de seguridad, pero también puede canalizar el archivo de prueba a través de los 3 comandos sed sin el" i ".
Dependiendo de su sistema (Linux o Mac), puede omitir el "" después de -i y, a veces, necesita el parámetro -e para las expresiones regulares. Tengo que probar lo que funciona para ti.
Pregunta relacionada con más información sobre sed: /programming/5410757/
fuente
#
es el comando de comentariosed
, así que esos no harán nada. Úselosed '\#patter#d'
si desea un delimitador RE diferente de/
. La[0-9]*
parte es redundante sin un^
ancla.-e
solo es necesario cuando quieres pasar varias expresiones. Linux es un kernel, Mac es una marca de computadora, ninguno tiene nada que versed
. La distinción es entre GNUsed
y FreeBSDsed
(que OS / X (como se encuentra en algunos Mac) heredó).