多くの行と列を持つ大きなファイルがあるとします。 bashを使用している行と列の数を調べたいです。
列:awk '{print NF}' file | sort -nu | tail -n 1
つかいます head -n 1
最小列数の場合、tail -n 1
最高の列数。
行:cat file | wc -l
またはwc -l < file
は、 [〜#〜] uuoc [〜#〜] 群集です。
列をカウントする代わりに、列間の区切り文字をカウントします。これは簡潔さと覚えやすさの良いバランスだと思います。もちろん、データに列区切り記号が含まれている場合、これは機能しません。
head -n1 myfile.txt | grep -o " " | wc -l
head -n1
を使用して、ファイルの最初の行を取得します。 grep -o
を使用してすべてのスペースをカウントし、見つかった各スペースを新しい行に出力します。 wc -l
を使用して、行数をカウントします。
ファイルが大きいが、各行の列数が同じままである(および見出しがない)場合は、次を使用します。
head -n 1 FILE | awk '{print NF}'
列数を検索するには、FILEがファイル名です。
行数を見つけるには、 'wc -l FILE'が機能します。
Bashを使用できます。 GB単位の非常に大きなファイルの場合は、awk/wc
。ただし、数MBのファイルのパフォーマンスは依然として管理可能である必要があります。
declare -i count=0
while read
do
((count++))
done < file
echo "line count: $count"
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
最初の列の数を数えるだけで十分な場合は、次を試してください。
awk -F'\t' '{print NF; exit}' myBigFile.tsv
ここで、\t
は列区切り文字です。
head -1 file.tsv |head -1 train.tsv |tr '\t' '\n' |wc -l
最初の行を取り、タブを変更します(または、コンマに「\ t」の代わりに「、」を使用できます)、行数をカウントします。
単純な行カウントは$(wc -l "$file")
です。 $(wc -lL "$file")
を使用して、行数と最長行の文字数の両方を表示します。
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,
空白ではなく、のフィールド区切り文字$.
は行番号(行数)です
純粋なbash(awk、Perl、または他の言語なし)の最初の行の列を数える非常に簡単な方法:
read -r line < $input_file
ncols=`echo $line | wc -w`
これは、データが適切にフォーマットされている場合に機能します。
次のコードはジョブを実行し、フィールド区切り文字を指定できるようにします。これは、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
awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' file
フィールド区切り文字として任意の区切り文字を使用でき、ROWSおよび列の数を検索できます