Estou preso em como posso excluir linhas mais recentes que a data especificada. Aqui está um trecho de conteúdo de um arquivo.
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
Gostaria de remover as linhas mais recentes que 03/12/2013, deixando apenas
647919 2013/11/30
647946 2013/11/30
647955 2013/12/01
Como isso pode ser feito através do bash?
bash
text-processing
Jason G
fonte
fonte
Essas datas têm a mesma ordem lexicográfica e cronológica, por isso é apenas uma questão de fazer uma comparação lexical:
fonte
Presumo que a
<br>
sua pergunta no final dadate
coluna seja algo indesejável. Em qualquer caso, pode ser removido facilmente se estiver presente. No entanto, chegando à parte principal, você pode conseguir o que está tentando fazer usando,Agora, o comando acima daria a saída de maneira ordenada. Agora, o comando abaixo deve fornecer o que você procura.
Explicação
O comando de classificação basicamente classifica o arquivo com base na segunda coluna, que é a data. Então, modifiquei seu arquivo de entrada para testar o comando se ele funciona, pois o arquivo de entrada tem todos os dados classificados por padrão. Depois disso, o
awk
comando imprime todas as linhas até encontrarmos uma correspondência específica.Teste
Agora, a
sort -k 2n filename.txt
saída é,Agora, estamos satisfeitos que o arquivo esteja classificado na segunda coluna. Agora, para selecionar valores UPTO uma data específica,
No exemplo acima, eu recebo todos os valores
2013/12/03
. A saída é,Não, isso
<br>
faz parte do meu arquivoSe for esse o caso, podemos ajustar um pouco o comando, como abaixo.
Estou apenas removendo todas as
<br>
tags da segunda coluna e canalizando o comando acima mencionado.Referências
https://unix.stackexchange.com/a/11323/47538
https://unix.stackexchange.com/a/83069/47538
fonte
Solução rápida e suja para a data que você deu, basta excluir todas as linhas com sed, que correspondem a datas posteriores a esta data:
O -i "" está substituindo diretamente dentro do arquivo e não criando um backup, mas você também pode canalizar o arquivo de teste através de todos os 3 comandos sed sem o -i "".
Dependendo do seu sistema (linux ou mac), você pode omitir o "" depois de -i e às vezes precisa do parâmetro -e para as expressões regulares. Tenho que tentar o que funciona para você.
Pergunta relacionada com mais informações sobre sed: /programming/5410757/
fonte
#
é o comando de comentáriosed
, para que eles não façam nada. Usesed '\#patter#d'
se você quiser um delimitador RE diferente de/
. A[0-9]*
peça é redundante sem uma^
âncora.-e
só é necessário quando você deseja passar várias expressões. linux é um kernel, mac é uma marca de computador, nada tem a versed
. A distinção é entre GNUsed
e FreeBSDsed
(que OS / X (como encontrado em alguns macs) herdou).