web-dev-qa-db-fra.com

unix - nombre de colonnes dans le fichier

Étant donné un fichier avec des données comme celle-ci (c'est-à-dire le fichier stores.dat)

sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200

Quelle serait une commande pour afficher le nombre de noms de colonnes?

dans l'exemple ci-dessus, il s'agirait de 4. (nombre de caractères de canal + 1 dans la première ligne)

Je pensais quelque chose comme:

awk '{ FS = "|" } ; { print NF}' stores.dat

mais il retourne toutes les lignes au lieu de la première et pour la première ligne, il retourne 1 au lieu de 4

63
toop
awk -F'|' '{print NF; exit}' stores.dat 

Quittez juste après la première ligne.

98
Mat

Ceci est une solution de contournement (pour moi: je n'utilise pas très souvent awk):

Affichez la première ligne du fichier contenant les données, remplacez tous les canaux par des nouvelles lignes, puis comptez les lignes:

$ head -1 stores.dat | tr '|' '\n' | wc -l
34
miku

Sauf si vous utilisez des espaces, vous devriez pouvoir utiliser | wc -w sur la première ligne.

wc est "Word Count", qui compte simplement les mots dans le fichier d'entrée. Si vous n'envoyez qu'une ligne, le nombre de colonnes vous sera indiqué.

11
Tom van der Woerdt

Tu pourrais essayer

fICHIER chat | awk '{print NF}'

4
Cat Kerr

Si vous avez python installé, vous pouvez essayer:

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat
1
Don Question

Solution Perl similaire à la solution awk de Mat:

Perl -F'\|' -lane 'print $#F+1; exit' stores.dat

J'ai testé cela sur un fichier avec 1000000 colonnes.


Si le séparateur de champ est un espace (un ou plusieurs espaces ou tabulations) au lieu d'un tube:

Perl -lane 'print $#F+1; exit' stores.dat
1
Chris Koknat

C'est généralement ce que j'utilise pour compter le nombre de champs:

head -n 1 file.name | awk -F'|' '{print NF; exit}'
1
user2533399

Propre pur bash façon

Sous bash, vous pouvez simplement:

IFS=\| read -ra headline <stores.dat
echo ${#headline[@]}
4

Beaucoup plus rapide comme sans fourches, et réutilisable comme $headline maintenez toute la ligne de tête. Vous pouvez, par exemple:

printf " - %s\n" "${headline[@]}"
 - sid
 - storeNo
 - latitude
 - longitude

Note Cette syntaxe conduira correctement les espaces et autres caractères dans les noms de colonnes.

Alternative: vérification binaire poussée du nombre maximal de colonnes sur chaque ligne

Et si certaines lignes contiennent des colonnes supplémentaires?

Cette commande recherchera une plus grande ligne, en comptant séparateurs:

tr -dc $'\n|' <stores.dat |wc -L
3

Il y a un maximum de 3 séparateurs, puis 4 champs.

0
F. Hauri

Basé sur la réponse de Cat Kerr. Cette commande travaille sur solaris

awk '{print NF; exit}' stores.dat
0
Manu Mitra

sélectionnez n'importe quelle ligne du fichier (dans l'exemple ci-dessous, il s'agit de la 2ème ligne) et comptez le nombre de colonnes, le délimiteur étant un espace:

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l
0
sAguinaga

vous pouvez essayer:

head -1 stores.dat | grep -o \|  | wc -l
0
user7231103