Corresponde à primeira parte do nome do caminho e ao número no final da linha

4

Eu tenho o seguinte tipo de saída de um find e grep pipe

./Columbia/815425_0001104659-11-049107.txt:         CENTRAL INDEX KEY:              0000815425
./Columbia/815425_0001104659-12-060231.txt:         CENTRAL INDEX KEY:              0000815425
./Columbia/815425_0001104659-13-066298.txt:         CENTRAL INDEX KEY:              0000815425
./Dimensional Advisors/355437_0001137439-04-000108.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-05-000205.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-06-000306.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-08-000364.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-09-000076.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-12-000295.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001140361-10-035592.txt:         CENTRAL INDEX KEY:              0000355437

Eu gostaria de obter

Columbia 0000815425
Columbia 0000815425
Columbia 0000815425
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437

Eu estava pensando em sed e grep , mas estou empenhado em como combinar tudo: correspondendo à primeira parte: (como faço para combinar logo antes do / ?)

erik Funds$ cat myoutput | egrep -o "[A-Z].*/"
Columbia/
Columbia/
Columbia/
Dimensional Advisors/
Dimensional Advisors/
Dimensional Advisors/
Dimensional Advisors/
Dimensional Advisors/
Dimensional Advisors/
Dimensional Advisors/

e os últimos 10 dígitos:

erik Funds$ cat myoutput | egrep -o "[0-9]{10}$"
0000815425
0000815425
0000815425
0000355437
0000355437
0000355437
0000355437
0000355437
0000355437
0000355437
    
por luffe 30.08.2016 / 12:58

4 respostas

7

awk com / como separador de campo e, em seguida, o campo de impressão 2 e o campo 3 (com o preenchimento com zero necessário):

... | awk -F/ '{ printf("%s %010d\n", $2, $3) }'

Exemplo:

$ cat file.txt 
./Columbia/815425_0001104659-11-049107.txt:         CENTRAL INDEX KEY:              0000815425
./Columbia/815425_0001104659-12-060231.txt:         CENTRAL INDEX KEY:              0000815425
./Columbia/815425_0001104659-13-066298.txt:         CENTRAL INDEX KEY:              0000815425
./Dimensional Advisors/355437_0001137439-04-000108.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-05-000205.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-06-000306.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-08-000364.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-09-000076.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001137439-12-000295.txt:         CENTRAL INDEX KEY:              0000355437
./Dimensional Advisors/355437_0001140361-10-035592.txt:         CENTRAL INDEX KEY:              0000355437

$ awk -F/ '{ printf("%s %010d\n", $2, $3) }' file.txt
Columbia 0000815425
Columbia 0000815425
Columbia 0000815425
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
    
por 30.08.2016 / 13:07
4
$ sed -E 's|^\./([^/]+)/.*\s([0-9]+)$| |' myoutput
Columbia 0000815425
Columbia 0000815425
Columbia 0000815425
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
Dimensional Advisors 0000355437
  • -E expressão regular estendida
  • ^\./ match ./ no início da linha
  • ([^/]+) captura não / caracteres
  • /.*\s match / e qualquer número de caracteres seguido pelo caractere de espaço em branco
  • ([0-9]+)$ captura dígitos no final da linha
  • cole os grupos capturados com espaço entre

sed permite usar qualquer delimitador, exceto \ e nova linha, portanto, use | aqui para evitar o escape de /

    
por 30.08.2016 / 13:07
2

awk - usando divisão do FS

Se você definir awk para dividir a entrada nos delimitadores de barra e, em seguida, resplitrar nos delimitadores de espaço, poderá selecionar os campos corretos:

<infile awk '{ n=$2; FS=" +"; $0=$0; print n, $NF; FS="/" }' FS=/

GNU awk - usando a descrição do campo FPAT

Se você descrever os campos corretamente com FPAT , poderá obter os resultados desejados. Aqui está um exemplo que funciona com sua entrada:

<infile awk '{ print $1, $NF }' FPAT='[[:alnum:][:space:]]+'

Saída

Columbia               0000815425
Columbia               0000815425
Columbia               0000815425
Dimensional Advisors               0000355437
Dimensional Advisors               0000355437
Dimensional Advisors               0000355437
Dimensional Advisors               0000355437
Dimensional Advisors               0000355437
Dimensional Advisors               0000355437
Dimensional Advisors               0000355437
    
por 30.08.2016 / 13:29
2

Aqui está uma solução alternativa, canalizando seus dados por meio de tr e cut :

…|tr ':' '/'|cut -d'/' -f2,5|tr -d '/'

O primeiro tr substitui : por / , para que cut possa usar / como um delimitador para isolar a última coluna, como já faz para a segunda. Como você extrai várias colunas, a saída de cut conterá um / como separador, a menos que você use seu --output-delimiter , mas é mais curto simplesmente excluir esse caractere usando tr -d .

Se você não quiser os múltiplos espaços, você pode adicionar um canal através de sed :

…|sed 's/  */ /g'
    
por 30.08.2016 / 16:42

Tags