extrai caracteres entre primeiro e segundo sublinhados de nomes de arquivos e conta tais arquivos na pasta linux

1

Eu gostaria de extrair caracteres entre o primeiro e o segundo sublinhados de nomes de arquivos em uma pasta e contar os tipos de arquivos presentes nele. A pasta contém arquivos em um formato específico, como:

2305195303310_ABC_A08_1378408840043.hl7

2305195303310_ABC_A08_1378408840043.hl7
Q37984932T467566261_DEF_R03_1378825633215.hl7
37982442T467537201_DEF_R03_1378823455384.hl7
37982442T467537201_MNO_R03_1378823455384.hl7
2305195303310_ABC_A08_1378408840053.hl7
Q37984932T467566261_DEF_R03_1378825633215.hl7
37982442T467537201_MNO_R03_1378823455384.hl7

e assim por diante

A saída do script deve me dar o resultado como:

ABC 3
DEF 3
MNO 2
    
por user1679829 28.11.2013 / 08:07

2 respostas

0

Você pode fazer isso da maneira clássica * nix, encadeando pequenos comandos juntos. Primeiro, encontre os arquivos de interesse, para isso você pode usar globbing :

for i in *_*_*; do echo "$i"; done

Esse comando imprimirá todos os arquivos no diretório atual cujo nome contém dois sublinhados. Para extrair a string entre esses underscores, você poderia usar cut , dizendo para usar _ como delimitador de campo e para imprimir o 2º campo:

cut -d '_' -f 2

Piping o primeiro comando através do segundo irá imprimir as seqüências de caracteres que você está interessado, mas também irá imprimir uma linha vazia para os casos em que não há nenhum caractere entre os sublinhados ( foo__bar , por exemplo). Você pode filtrá-los usando grep . , que imprimirá apenas linhas que contenham pelo menos um caractere (incluindo espaço em branco). Finalmente, você pode contar passando a saída através de sort e uniq -c .

Colocando tudo junto, você ganha:

$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done | 
   grep . | sort | uniq -c

  3 ABC
  2 DEF
  1 MNO

Se você realmente quer que o número esteja do outro lado, você pode usar awk :

$ for i in *_*_*; do echo "$i" | cut -d '_' -f 2 ; done | 
   grep . | sort | uniq -c | awk '{print $2,$1}'

ABC 3
DEF 2
MNO 1
    
por 29.11.2013 / 05:39
-1
ls | cut -d_ -f2 | sort | uniq -c
    
por 11.02.2015 / 17:07