2011-12-25 4 views
48

内の列の数この(すなわちstores.datファイル)などのデータを含むファイルを考えるとUNIX - 列名の数を出力するコマンドになり何のファイル

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

?例では

すなわち、それは4になり、上記(最初の行にパイプ文字の数+ 1)

私のようなものを考えていた:

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

をしかし、それはすべての行を返す代わりに、ちょうど最初の行では4の代わりに1を返します

答えて

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

最初の行の直後に終了してください。

+1

または 'awk -F '|' 'NR == 1 {print NF}' stores.dat' –

+10

@JaypalSingh:それはファイル全体を読むでしょう。 – Mat

+0

どちらも同じ正しい出力を返すように見えますが、1つのパフォーマンス上のメリットは他のもの(またはその他のメリット)に比べていくかですか? – toop

9

空白を使用していない限り、最初の行に| wc -wを使用できるはずです。

wcは「ワードカウント」で、入力ファイル内の単語を単純にカウントします。 1行だけを送信すると、列の量がわかります。

+0

私は試しました:head -1 stores.dat | wc -wしかし、それは私の後に戻って来ません。 – toop

+0

これは、 '|'をスペースで置き換えないためです - 'wc'はスペースで区切られた単語を数えます。 'head -1 stores.dat |を使ってください。 tr '|' '' | wc -w' –

+2

完全性のために、回答にあなたのコメントを追加してください。 – Xofo

28

これは、回避策です(私のために:私は非常に頻繁にawkを使用しないでください):

は、データを含むファイルの最初の行を表示します改行ですべてのパイプを交換して、ラインカウント:

$ head -1 stores.dat | tr '|' '\n' | wc -l 
+6

maaany列を持つファイル(SNPデータと考える)の場合は、これが最善の方法です。 Matの解決策が返されました: "awk:プログラム限界を超えました:最大フィールドサイズ= 32767" –

1

あなたは、Pythonは、あなたが試みることができるインストールしている場合:

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

この特別な場合、標準入力 'cat x.txt | python -c "p​​rint raw_input()。count( '|')+ 1" ' –

+0

長いファイルが多い場合は、短くても高速ではありません!私は彼が純粋な(確かに大きい)データファイルの目の中でより速い解決を望んだと思った。 –

1

これは私がフィールドの数をカウントするために使用するものは通常です:

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

あなたは

猫を試みることができますFILE |マットのawkのソリューションに類似のawk '{NFを印刷}'

1

Perlのソリューション:

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

私は1000000個の列を持つファイルでこれをテストしてみました。


フィールドセパレータではなく、パイプの(1つまたは複数のスペースまたはタブ)空白である場合:

perl -lane 'print $#F+1; exit' stores.dat 
0

キャットカー応答に基づい。 このコマンドは、あなたがしようもSolarisの

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

そして、あなたは受け入れられた答えから適切なフィールド区切りを差し引いています。これは、入力例に対して "1"を返します。 –

+0

これは、フィールド区切りなしの受け入れられた答えと本質的に同じです。Bejaminは1を返しますが、スペースで区切られたファイルに対しては動作するはずであるためです。 – discipulus

0

に取り組んでいる:

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

はどこ、ファイル内の任意の行を選択します(以下の例では、それは第二行だ)と列の数を数えます区切り記号はスペースです。

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l 
関連する問題