web-dev-qa-db-fra.com

compte le nombre de colonnes dans bash

Disons que j'ai un gros fichier avec beaucoup de lignes et beaucoup de colonnes. J'aimerais connaître le nombre de lignes et de colonnes que j'ai avec bash.

26
Nick

Colonnes: awk '{print NF}' file | sort -nu | tail -n 1

Utilisez head -n 1 pour le plus petit nombre de colonnes, tail -n 1 pour le plus grand nombre de colonnes.

Lignes: cat file | wc -l ou wc -l < file pour le UUOC foule.

49
Erik

Vous pouvez également compter les séparateurs entre les colonnes. Je trouve cela conciliant concision et facilité de mémoire. Bien entendu, cela ne fonctionnera pas si vos données incluent le séparateur de colonnes.

head -n1 myfile.txt | grep -o " " | wc -l

Utilise head -n1 pour saisir la première ligne du fichier . Utilise grep -o pour compter tous les espaces et afficher chaque espace trouvé sur une nouvelle ligne. Utilise wc -l pour compter le nombre de lignes.

5
GGibson

Si votre fichier est volumineux mais que vous êtes certain que le nombre de colonnes reste identique pour chaque ligne (et que vous n'avez pas d'en-tête), utilisez:

head -n 1 FILE | awk '{print NF}'

pour trouver le nombre de colonnes, où FILE est le nom de votre fichier.

Pour trouver le nombre de lignes, "wc -l FILE" fonctionnera.

4
Fabio

Vous pouvez utiliser bash. Remarque pour les très gros fichiers en Go, utilisez awk/wc. Cependant, les performances devraient toujours être gérables pour les fichiers de quelques Mo.

declare -i count=0
while read
do
    ((count++))
done < file    
echo "line count: $count"
2
bash-o-logist

La réponse de kirill_igum est un peu déformée et vous pouvez facilement compter le nombre de colonnes de chaque ligne de votre choix. C'est pourquoi je suis arrivé à cette question, même si la question demande le fichier entier. (Bien que si votre fichier comporte les mêmes colonnes dans chaque ligne, cela fonctionne toujours bien sûr):

head -2 file |tail -1 |tr '\t' '\n' |wc -l

Donne le nombre de colonnes de la ligne 2 . Remplacez 2 par 55 pour l’obtenir par exemple pour la ligne 55.

-bash-4.2$ cat file
1       2       3
1       2       3       4
1       2
1       2       3       4       5

-bash-4.2$ head -1 file |tail -1 |tr '\t' '\n' |wc -l
3
-bash-4.2$ head -4 file |tail -1 |tr '\t' '\n' |wc -l
5

Le code ci-dessus fonctionne si votre fichier est séparé par des tabulations, comme nous le définissons comme "tr". Si votre fichier contient un autre séparateur, par exemple des virgules, vous pouvez toujours compter vos "colonnes" en utilisant la même astuce en remplaçant simplement le caractère de séparation "t" par ",":

-bash-4.2$ cat csvfile
1,2,3,4
1,2
1,2,3,4,5
-bash-4.2$ head -2 csvfile |tail -1 |tr '\,' '\n' |wc -l
2
2
FatihSarigol

Si compter le nombre de colonnes dans la première suffit, essayez ce qui suit: 

awk -F'\t' '{print NF; exit}' myBigFile.tsv

\t est le délimiteur de colonne.

1
Jelena-bioinf
head -1 file.tsv |head -1 train.tsv |tr '\t' '\n' |wc -l

prenez la première ligne, changez les onglets (ou vous pouvez utiliser ',' au lieu de '\ t' pour les virgules), comptez le nombre de lignes. 

1
kirill_igum

Le nombre de lignes simples est $(wc -l "$file"). Utilisez $(wc -lL "$file") pour afficher le nombre de lignes et le nombre de caractères de la ligne la plus longue.

1
Tim Sylvester

Solution Perl:

Perl -ane '$maxc = $#F if $#F > $maxc; END{$maxc++; print "max columns: $maxc\nrows: $.\n"}' file

Si votre fichier d'entrée est séparé par une virgule:

Perl -F, -ane '$maxc = $#F if $#F > $maxc; END{$maxc++; print "max columns: $maxc\nrows: $.\n"}' file

sortie:

max columns: 5
rows: 2

-a découpe automatiquement la ligne d'entrée dans le tableau @F
$#F est le nombre de colonnes -1
-F, champ séparateur de, au lieu d'espaces
$. est le numéro de la ligne (nombre de lignes)

0
Chris Koknat

Un moyen très simple de compter les colonnes de la première ligne en pure bash (no awk, Perl ou d'autres langues):

read -r line < $input_file
ncols=`echo $line | wc -w`

Cela fonctionnera si vos données sont correctement formatées.

0
EAdrianH

Le code suivant fera le travail et vous permettra de spécifier le délimiteur de champ. Ceci est particulièrement utile pour les fichiers contenant plus de 20 000 lignes. 

awk 'BEGIN { 
  FS="|"; 
  min=10000; 
}
{ 
  if( NF > max ) max = NF; 
  if( NF < min ) min = NF;
} 
END { 
  print "Max=" max; 
  print "Min=" min; 
} ' myPipeDelimitedFile.dat
0
aprodan
awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' file

Vous pouvez utiliser n’importe quel délimiteur comme séparateur de champ et trouver des numéros de ROWS et des colonnes.

0
Wasif