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 /
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=/
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:]]+'
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'