Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

1. Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 08:10h

Tenho 2 arquivos listados usando o comando ls -ltr para mostrar sempre quem é mais antigo primeiro.
O problema é que os horários são divergentes entre eles. O que interessa é a ordem e o nome do arquivo no final.
Preciso saber quem está no arquivo antes.txt que não está no arquivo agora.txt

Quando gerar o arquivo faltas.txt deve entrar na ordem que já estava em antes.txt (mas não é obrigatório. Se conseguir separar já está ótimo rsrs.
Arquivo agora.txt

-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:49 f_canal_012.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_015.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:55 f_canal_001.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:59 f_canal_005.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:59 f_canal_004.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:59 f_canal_008.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:59 f_canal_011.txt


Arquivo antes.txt

-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:44 f_canal_012.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:44 f_canal_013.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:44 f_canal_014.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:44 f_canal_015.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:50 f_canal_001.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_002.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_003.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_005.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_004.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_006.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_007.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_008.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_009.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_010.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_011.txt


Na pratica, o arquivo faltas.txt precisa ser gerado conforme segue:


-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:44 f_canal_013.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:44 f_canal_014.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_002.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_003.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_006.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_007.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_009.txt
-rw-rw-r-- 1 gatux gatux 171 Mai 10 07:53 f_canal_010.txt


Caso o arquivo faltas.txt possa ficar fora de ordem não terá problema também. Se fosse em ordem seria melhor.

Tentei usar o diff mas como tem horários diferentes não consegui fazer funcionar kkk. Tem como usar o diff testando somente uma parte da linha ?



  


2. MELHOR RESPOSTA

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 10/05/2012 - 11:30h

fgrep -v -f agora.txt antes.txt > falta.txt

3. Re: Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 09:07h

Reformulando o enunciado para ficar mais fácil. Removi as datas e horários dos arquivos.

antes.txt

f_canal_015.txt
f_canal_001.txt
f_canal_002.txt
f_canal_003.txt
f_canal_005.txt
f_canal_004.txt
f_canal_006.txt
f_canal_007.txt
f_canal_008.txt
f_canal_009.txt
f_canal_010.txt
f_canal_011.txt
f_canal_012.txt
f_canal_013.txt
f_canal_014.txt


atual.txt

f_canal_004.txt
f_canal_001.txt
f_canal_015.txt
f_canal_014.txt
f_canal_002.txt


A comparação deve resultar em 2 arquivos:
faltas.txt

f_canal_003.txt
f_canal_005.txt
f_canal_006.txt
f_canal_007.txt
f_canal_008.txt
f_canal_009.txt
f_canal_010.txt
f_canal_011.txt
f_canal_012.txt
f_canal_013.txt


**NovoAnterior.txt Nada mais é do que a soma de faltas.txt com atual.txt, sendo que o atual.txt tem que entrar por último.


f_canal_003.txt
f_canal_005.txt
f_canal_006.txt
f_canal_007.txt
f_canal_008.txt
f_canal_009.txt
f_canal_010.txt
f_canal_011.txt
f_canal_012.txt
f_canal_013.txt
f_canal_004.txt
f_canal_001.txt
f_canal_015.txt
f_canal_014.txt
f_canal_002.txt



Na próxima vez que gerar, o NovoAnterior.txt passa a ser o arquivo antes.txt e o ciclo se inicia. Infelizmente a ordem para gerar o NovoAnterior.txt e o faltas.txt é importante SIM
Usando o sort em ambos fica fácil encontrar as diferenças usando o dif, mas não resolve a questão da ordem original do faltas.txt e muito menos do NovoAnterior.txt

Sugestões ?

Pensei em ordenar o antes.txt e atual.txt. Com base nas diferenças, extrair somente quem não está (faltas.txt) Esta parte ordenada é fácil. De qualquer forma, acho que não vou conseguir escapar de fazer loop dentro de ambos. Queria tentar escapar dos loops.






4. Re: Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 10/05/2012 - 10:20h

Fiz um codigo aqui. Vê se te ajuda.


#!/bin/bash
awk '{
while((getline linha < "atual.txt" )>0){
if(match(linha,$1)==0) {
notFound=1
}
}
close("atual.txt")
if(notFound==1) {
print $1
}
}' antes.txt


Execute:
shell> ./cod.sh | sort


5. Re: Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 10/05/2012 - 11:36h

cat faltas.txt agora.txt > novoanterior.txt


6. Re: Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 11:37h

foxbit3r escreveu:

Fiz um codigo aqui. Vê se te ajuda.


#!/bin/bash
awk '{
while((getline linha < "atual.txt" )>0){
if(match(linha,$1)==0) {
notFound=1
}
}
close("atual.txt")
if(notFound==1) {
print $1
}
}' antes.txt


Execute:
shell> ./cod.sh | sort


Valeu @foxbit3r, mas não rolou. Ele devolve os itens ordenados para montar o novoarquivo e não trata as faltas.txt


7. Re: Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 11:51h

fdmarp escreveu:

fgrep -v -f agora.txt antes.txt > falta.txt


Mil perdões rsrs. Sua solução está 100% ;)

Agora vou estudar os parâmetros que você usou porque tinha tentado com o grep e não tinha dado certo. Valeu mesmo.

Em breve a solução final.



8. Re: Gerar arquivo faltas.txt de quem não existe no arquivo agora.txt [RESOLVIDO]

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 12:00h

AprendiNoLinux escreveu:

fdmarp escreveu:

fgrep -v -f agora.txt antes.txt > falta.txt


Mil perdões rsrs. Sua solução está 100% ;)

Agora vou estudar os parâmetros que você usou porque tinha tentado com o grep e não tinha dado certo. Valeu mesmo.

Em breve a solução final.


Na solução do fdmarp, ele usou 2 parâmetros combinados e produziu uma saída perfeita.

-v -v, --invert-match seleciona somente linhas não coincidentes
-f -f, --file=ARQUIVO obtém PADRÃO do ARQUIVO (NUNCA iria saber sobre como combinar este -f. O grande macete estava aqui ;) )

De qualquer forma @foxbit3r , valeu pela ajuda.


9. Solução FINAL na prática...

Geraldo Albuquerque
AprendiNoLinux

(usa Ubuntu)

Enviado em 10/05/2012 - 12:18h


.

#!/bin/bash
# Pakarge......: atender_canais.sh
# RoadMap......: Gera arquivo antes.txt com arquivos do diretório canais.
# .............: No diretório de processamento recolher arquivos. atual.txt
# .............: Comparar com arquivos do diretório de canais.
# .............: antes.txt x atual.txt
# .............: Gera arquivo faltas.txt somente de quem não está no atual.txt
# .............: Gerar novo arquivo para diretório canais na ordem
# .............: atual.txt + fatas.txt. Deverá conter todos canais
# .............: A ordem é importante a ser mantida porque serve para atender os
# .............: canais mais antigos sempre em primeiro.
##############################################################################
# Variáveis públicas.
TMP_DIR="/tmp/trb"
FILE_NAME_ANTES="antes.txt"
FILE_NAME_ATUAL="atual.txt"
FILE_NAME_FALTA="faltas.txt"
FILE_NAME_CANAIS="canais.txt"
PREFIX_FILES="f_canal_"
DIR_CANAIS="/home/gatux/scripts/pasta_virtual/filas"
DIR_TRB="/home/gatux/scripts/pasta_virtual/movimentos"
ARQ_ANTES="${TMP_DIR}/${FILE_NAME_ANTES}"
ARQ_ATUAL="${TMP_DIR}/${FILE_NAME_ATUAL}"
ARQ_FALTA="${TMP_DIR}/${FILE_NAME_FALTA}"
ARQ_CANAIS="${DIR_TRB}/${FILE_NAME_CANAIS}"
# Funções
function gera_file_antes()
{
# Gera arquivo com o conteúdo dos canais.
echo "${DIR_CANAIS}/${PREFIX_FILES}"
ls -ltr ${DIR_CANAIS}/${PREFIX_FILES}* | sed "s/.*${PREFIX_FILES}/${PREFIX_FILES}/g" > ${ARQ_ANTES}
}

function gera_file_atual()
{
# Gera arquivo com o conteúdo do momento atual.
echo "${DIR_TRB}/${PREFIX_FILES}"
ls -ltr ${DIR_TRB}/${PREFIX_FILES}* | sed "s/.*${PREFIX_FILES}/${PREFIX_FILES}/g" > ${ARQ_ATUAL}
}

function gera_file_faltas()
{
# Créditos: Solução by @fdmarp
fgrep -v -f ${ARQ_ATUAL} ${ARQ_ANTES} > ${ARQ_FALTA}
}

function gera_nova_fila()
{
# Créditos: Solução by @fdmarp
cat ${ARQ_FALTA} ${ARQ_ATUAL} > ${ARQ_CANAIS}
}

function atualiza_filas()
{
# Regrava o arquivo anterior de canais para compor as filas.
mv ${ARQ_CANAIS} ${ARQ_ANTES}
}

function apaga_faltas()
{
# Remove arquivo de faltas.
rm ${ARQ_FALTA}
}

function apaga_atual
{
# Remove arquivo temporário de filas.
rm ${ARQ_ATUAL}
}

# Apenas como exemplo:
gera_file_antes # Gerando todos canais.
sleep 20
gera_file_atual # Gera o que tenho agora.
sleep 20
gera_file_faltas
sleep 1
gera_nova_fila
# etc... etc...



Arquivos de exemplo para testes:


antes.txt
f_canal_015.txt
f_canal_001.txt
f_canal_002.txt
f_canal_003.txt
f_canal_005.txt
f_canal_004.txt
f_canal_006.txt
f_canal_007.txt
f_canal_008.txt
f_canal_009.txt
f_canal_010.txt
f_canal_011.txt
f_canal_012.txt
f_canal_013.txt
f_canal_014.txt



atual.txt
f_canal_004.txt
f_canal_001.txt
f_canal_015.txt
f_canal_014.txt
f_canal_002.txt


O resto é montado por este script.

https://twitter.com/#!/GA_Tux/status/201276378082062336






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts