2017-08-30 3 views
0

Dans Unix, supposons un fichier contient 5 champs & données tels que:comment extraire un séparateur contenant des champs de fichier en utilisant la commande cut

"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male" 

besoin d'extraire 4e champ. en utilisant ci-dessous

column_value=`echo $line | cut -f4 -d'|'` 

seulement, nous aurons seulement " FAX 022 3987789 \

mais ont besoin " FAX 022 3987789 \| TEL 77766288892 \| abc " comme valeur 4ème colonne.

+1

'cut' n'est pas le bon outil. Vous avez besoin d'un analyseur CSV. –

+0

Plus précisément, lire la valeur dans une variable '$ line' est probablement la mauvaise approche (et si vous le faites vraiment, utilisez' read -r' et citez '" $ line "' partout). – tripleee

Répondre

0

vous pouvez ajouter les deux champs supplémentaires comme suit

echo $line | cut -f 4,5,6 -d\| 

Sinon, vous pouvez utiliser sed pour remplacer le « | » delimiter avec un autre char (par exemple un onglet)

echo $line | sed s/\"\|\"/\t/g | cut -f 4 
1

cut n'est pas le droit outil pour le travail quand il implique un caractère multi-delimiter nécessaire pour analyser la chaîne d'entrée/fichier.

Vous pouvez utiliser GNU Awk with FPAT qui définit à quoi doit ressembler chaque champ d'un enregistrement. Vous pouvez écrire FPAT comme constante d'expression régulière, auquel cas quelque chose comme ci-dessous devrait fonctionner.

FPAT = "(\"[^\"]+\")" 

En utilisant cette commande dans la Awk,

line='"112233"|"Roshan"|"25"|" FAX 022 3987789 \| TEL 77766288892 \| abc "|"Male"' 
awk ' 
BEGIN { 
    FPAT = "(\"[^\"]+\")" 
}{print $4}' <<<"$line" 

produit une sortie comme

" FAX 022 3987789 \| TEL 77766288892 \| abc " 

Regular Expression - Test results

+2

Voir aussi https://stackoverflow.com/questions/7804673/escaping-separator-within-double-quotes-in-awk – tripleee