É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
awk -F'|' '{print NF; exit}' stores.dat
Quittez juste après la première ligne.
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
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é.
Tu pourrais essayer
fICHIER chat | awk '{print NF}'
Si vous avez python installé, vous pouvez essayer:
python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
stores.dat
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
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}'
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.
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.
Basé sur la réponse de Cat Kerr. Cette commande travaille sur solaris
awk '{print NF; exit}' stores.dat
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
vous pouvez essayer:
head -1 stores.dat | grep -o \| | wc -l