Compter le nombre de colonne dans un tuyau d'un fichier délimité
J'ai un tuyau |
fichier délimité.
Fichier:
106232145|"medicare"|"medicare,medicaid"|789
Je voudrais compter le nombre de champs de chaque ligne. J'ai essayé le code ci-dessous
Code:
awk -F '|' '{print NF-1}'
Cela me renvoie le résultat sous la forme de 5 au lieu de 4. C'est parce que le awk prend "medicare|medicaid" comme deux domaines différents au lieu d'un champ
- La seule façon que je peux penser à ce que vous avez 5 au lieu de 4 avec cette commande si vous avez réellement fait
awk -F\" ...
(ou à la place de la double citation, l'un des autres personnages qui se produit 4 fois dans la chaîne, commed
oui
...). En fait, avecNF-1
, vous devriez avoir obtenu 3 à la place... - Mais ton exemple ne contiennent pas de "medicare|medicaid" ??
- Si vous avez des données que peut contenir le délimiteur dans la cité des valeurs de champ, alors vous avez besoin d'un spécialisé CSV style de l'analyseur. Les chances sont
csvfix
pouvez faire ce que vous avez besoin. Voir aussi Linux outil pour analyser les fichiers CSV. Il y a des modules Perl à l'aide; il est probable que Python et Ruby ont des modules pour aider trop.
Vous devez vous connecter pour publier un commentaire.
donne le résultat correct.
Pur Unix solution (sans awk/Perl):
Perl solution - 1-liner:
MAIS!!!! IMPORTANT!!!
Chacun de ces solutions, ainsi que celles concernant d'autres réponses - ne PAS travailler à 100%!
À savoir, ils cassent tous quand c'est un VÉRITABLE "pipe-séparé" du fichier, avec un tuyau à un caractère valide dans le champ (et le terrain d'être cités), le chemin réel de fichiers CSV travail.
E. g.
Pour corriger cela, un bon CSV (ou d'un fichier délimité) analyseur doit être utilisé, comme on en Perl:
Imprime valeur correcte
Comme une note, il suffit de la fixation d'un
awk
oused
solution alambiquée RegEx ne fonctionne pas facilement, puisque sur le dessus de la pipe-contenant-et-cité PSV champs, le spec permet également citations comme une partie du domaine ainsi. Qui ne se prête PAS à une belle RegEx solution.tr
,head
etwc
ne sont pas plus "pure unix" queawk
...perl
est un peu différente de l'histoire...perl
, maisawk
fait partie de SUS, LSB et d'autres normes similaires. Bien sûr, quelqu'un pourrait intentionnellement choisir de ne pas installer certains paquets de base, mais cela ne veut pas rendre leur installation plus "pur" (et en fait, peut le rendre plus "cassé")...tar
archive ou unshar
ouuuencoded
fichier, c'est encore un "pack" au sens générique. Et bien que je n'ai jamais travaillé sur un PDP-11, je fais au moins souvenez-vous de l'installation de SunOS 2.5 à partir de disquettes, et de l'apprentissage C dans un AT&T SVR2 système...awk
awk
NIperl
. La raison pour laquelle je n'ai pas la fourniture d'unawk
solution est parce qu'il était déjà présent dans une autre réponse, pas de profondsawk
la haine 🙂awk
- systèmes comme la mienne qui sont Windows boxen avec un ensemble de commandes Unix installé (PAS de cygwin), mais pas de Strawberry Perl. AFAIR, ces forfaits comprennent tr/tête/etc... mais PAS awk. Rappelez-vous, vous ne les appelez pas "Unix", je suppose 🙂 de toute façon, si c'était sur la Politique de la SE, l'ensemble de ce fil de commentaires aurait été nuked par Yannis déjà, comme il est totalement hors de propos à la question OU la réponse elle-même :). Et je ne vois pas de "vous permet de prendre cela pour chat" lien pour une raison quelconque.Cela fonctionne pour n'importe quel caractère unique séparateur qui n'est PAS un guillemet double, sens standard délimités par des tabulations, CSV, etc. formats (standard comme ils obtiennent tout de même...)
Le format de sortie est purement illustrative et un peu décoratifs à la fin, mais le contenu est toujours utile, à mon humble avis, comme la gestion de plusieurs fichiers. En tout cas, j'espère que cela aide! 🙂
Modifier
Cela a été testé à l'aide de mawk et GNU awk (gawk), dont le dernier a été testé en traditionnel, POSIX et les modes par défaut. Garniture de commentaires et de sortie des déclarations pour le trouver, il en fait un petit programme, mais il n'est pas aussi petit que l'on voudrait.
Pour un
|
fichier délimité avec embedded|
entre ceGNU awk v4.0
ou version ultérieure devrait fonctionner:awk
est comme l'analyse de xml. Va briser à quelques rares cas de bord.perl -ne 'print scalar( split( /\|/, $_ ) ) . "\n"'
[nom de fichier]