web-dev-qa-db-ja.com

bashの列数をカウントします

多くの行と列を持つ大きなファイルがあるとします。 bashを使用している行と列の数を調べたいです。

33
Nick

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

つかいます head -n 1最小列数の場合、tail -n 1最高の列数。

行:cat file | wc -lまたはwc -l < fileは、 [〜#〜] uuoc [〜#〜] 群集です。

59
Erik

列をカウントする代わりに、列間の区切り文字をカウントします。これは簡潔さと覚えやすさの良いバランスだと思います。もちろん、データに列区切り記号が含まれている場合、これは機能しません。

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

head -n1を使用して、ファイルの最初の行を取得します。 grep -oを使用してすべてのスペースをカウントし、見つかった各スペースを新しい行に出力します。 wc -lを使用して、行数をカウントします。

6
GGibson

ファイルが大きいが、各行の列数が同じままである(および見出しがない)場合は、次を使用します。

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

列数を検索するには、FILEがファイル名です。

行数を見つけるには、 'wc -l FILE'が機能します。

4
Fabio

Bashを使用できます。 GB単位の非常に大きなファイルの場合は、awk/wc。ただし、数MBのファイルのパフォーマンスは依然として管理可能である必要があります。

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

Kirill_igumの答えに少しひねりを加え、必要な特定の行の列数を簡単に数えることができます。そのため、質問がファイル全体を要求しているのに、この質問に来ました。 (ファイルの各行に同じ列がある場合でも、もちろんこれは機能します):

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

行2の列数を示します。たとえば、2を55に置き換えて、行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

上記のコードは、「tr」に定義しているように、ファイルがタブで区切られている場合に機能します。ファイルに別の区切り記号(コンマなど)がある場合でも、区切り文字 "t"を "、"に変更するだけで、同じトリックを使用して "列"をカウントできます。

-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

最初の列の数を数えるだけで十分な場合は、次を試してください。

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

ここで、\tは列区切り文字です。

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

最初の行を取り、タブを変更します(または、コンマに「\ t」の代わりに「、」を使用できます)、行数をカウントします。

1
kirill_igum

単純な行カウントは$(wc -l "$file")です。 $(wc -lL "$file")を使用して、行数と最長行の文字数の両方を表示します。

1
Tim Sylvester

Perlソリューション:

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

入力ファイルがカンマ区切りの場合:

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

出力:

max columns: 5
rows: 2

-a入力行を@F配列に自動分割します
$#Fは列数-1です
-F,空白ではなく、のフィールド区切り文字
$.は行番号(行数)です

0
Chris Koknat

純粋なbash(awk、Perl、または他の言語なし)の最初の行の列を数える非常に簡単な方法:

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

これは、データが適切にフォーマットされている場合に機能します。

0
EAdrianH

次のコードはジョブを実行し、フィールド区切り文字を指定できるようにします。これは、20k行を超えるファイルを含む場合に特に便利です。

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

フィールド区切り文字として任意の区切り文字を使用でき、ROWSおよび列の数を検索できます

0
Wasif