Imprimindo arquivos ausentes de uma tupla

1

Eu tenho uma lista grande de tuplas de arquivos no formato:

A_1.txt
A_2.txt 
B_1.txt 
B_2.txt 
C_1.txt  <<
D_1.txt
D_2.txt
E_1.txt
E_2.txt

em um diretório. Como você pode ver, C_2.txt está faltando na minha lista. Eu preciso encontrar uma maneira legal de encontrar qual desses arquivos está faltando seu "parceiro" e imprima esse arquivo usando bash . Eu acho que preciso modificar isso:

x=$(pwd)
find $x -type f -printf '%f\n' | sort | uniq -c

para incluir {0: 1} para que ele pesquise apenas o primeiro caractere da minha lista e imprima quantos arquivos começam com esse primeiro caractere.

Resultado esperado:

2  A
2  B
1  C
2  D
2  E

ou saída ideal (ideal):

C_1.txt
    
por tbs35 14.07.2017 / 07:35

2 respostas

0

Faça um loop sobre os nomes dos arquivos, extraia o prefixo (a string antes do primeiro _ ) e verifique quantos arquivos começam com esse prefixo (usei set , mas você também pode usar uma matriz e verificar sua duração)

Se for apenas um, imprima seu nome:

for f in ./*.txt; do
n=${f%%_*}
set -- "${n}"_*
[ $# -eq 1 ] && printf '%s\n' "${f}"
done
set --
    
por 20.07.2017 / 12:50
0

Canalize sua lista de arquivos para

sed -n '$!N;/\(.*\)1.txt\n.txt/!{P;D;}'

Isso sempre lê um par de linhas e, se não for um par de something1.txt com something2.txt , a linha órfã é impressa, então é dada a sua "saída ideal esperada".

Explicação detalhada:

  • N acrescenta a próxima linha ao espaço padrão, então você tem duas linhas, incluindo a nova linha entre
  • /\(.*\)1.txt\n.txt/ é um "endereço", selecionando se o próximo comando deve ser executado. Pode ser um número de linha, um intervalo ou, neste caso, uma expressão regular que deve corresponder ao espaço do padrão. .* pode corresponder a qualquer string e cercá-la com \(.*\) , depois podemos referenciá-la como . Portanto, \n significa uma nova linha, seguida pela cadeia desde o início, seguido por 2 . Assim, estamos pesquisando por anystring1.txt anystring2.txt
  • O ! após o endereço inverte a correspondência, portanto, o seguinte só é executado se o espaço do padrão não corresponder à expressão. Este é o caso se a linha não pertencer a um par.
  • o {} forma um bloco de comandos, o que significa que todos os comandos internos são executados apenas se o padrão corresponder
  • P imprime o espaço do padrão até a primeira nova linha, portanto, apenas a primeira linha é impressa (porque não sabemos se o segundo pode pertencer a um par).
  • finalmente, D apaga o espaço do padrão até a primeira nova linha e o próximo ciclo é iniciado com a linha restante, que será novamente tentada emparelhar com a seguinte.

Espero que esta explicação tenha ajudado você a aprender um pouco de sed . *

    
por 14.07.2017 / 07:47

Tags