Associe la première partie du path et le numéro à la fin de la ligne

J'ai le type suivant de sortie d'un tuyau de find et grep

 ./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 

J'aimerais get

 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 

Je pensais sed et grep , mais je suis coincé avec la façon de tout combiner: faire correspondre la première partie: (comment puis-je correspondre juste avant le / ?)

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

et les 10 derniers numbers numériques:

 erik Funds$ cat myoutput | egrep -o "[0-9]{10}$" 0000815425 0000815425 0000815425 0000355437 0000355437 0000355437 0000355437 0000355437 0000355437 0000355437 

awk avec / comme séparateur de champs, puis printing du champ 2 et du champ 3 (avec remplissage de zéro nécessaire):

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

Exemple:

 $ 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 
 $ sed -E 's|^\./([^/]+)/.*\s([0-9]+)$|\1 \2|' 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 expression régulière étendue
  • ^\./ match ./ au début de la ligne
  • ([^/]+) capture non / caractères
  • /.*\s match / et tout nombre de caractères suivi d'un caractère blanc
  • ([0-9]+)$ saisir les numbers à la fin de la ligne
  • \1 \2 coller les groupes capturés avec un espace entre les deux

sed permet d'utiliser n'importe quel délimiteur sauf \ et newline, donc en utilisant | ici pour éviter d'échapper /

awk – en utilisant le fractionnement FS

Si vous définissez awk pour séparer l'input des délimiteurs de barres obliques, puis resplit sur les délimiteurs d'espace, vous pouvez sélectionner les champs corrects:

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

GNU awk – utilisation de la description du champ FPAT

Si vous décrivez les champs correctement avec FPAT vous pouvez get les résultats souhaités. Voici un exemple qui fonctionne avec votre consortingbution:

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

Sortie

 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 

Voici une solution alternative, canalisant vos données à travers tr et cut :

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

Le premier tr remplace : avec / , de sorte que cut peut utiliser / comme délimiteur pour isoler la dernière colonne, comme c'est déjà le cas pour le second. Puisque vous extrayez plusieurs colonnes, la sortie de cut contiendra un / comme séparateur, sauf si vous utilisez son --output-delimiter , mais il est plus court de simplement supprimer ce caractère en utilisant tr -d .

Si vous ne voulez pas les espaces multiples, vous pouvez append un canal via sed :

 …|sed 's/ */ /g'