ユーティリティを使用してテキストファイルの1行あたりのタブ数を計算する

ユーティリティを使用してテキストファイルの1行あたりのタブ数を計算する

タブリストファイルがあります。各行のタブ数が同じであることを確認したいと思います。

最初のステップとして、1行あたりのタブ数を印刷したいと思います。

私はそれを試しましたが、grep -o '\t' infile | wc -l私の実装はgrep次のとおりですgrep: invalid option -- o。別の方法がありますか?


良い点:可能であれば、個人的な好みのためにこれを行うには、util(grep、catなど)ツールを使用することをお勧めします。いいえ awkまたはbashスクリプト。

答え1

sedetcはこれには適していないと思います。簡単な方法は、awkタブをフィールド区切り文字として使用して呼び出すことです。

printf $'hello\tworld\thugo\nfoo\tbar\nbaz\n' | awk -F$'\t' '{print NF-1;}'

これは作る

2
1
0

答え2

目標が各行に常に同じ数のタブがあることを検出することである場合(bashも、awkもなし):

sed 's/[^\t]//g' file | sort -u | wc -l

1が出力されたらすごいですね!

または次sedに変更してくださいtr

tr -cd \\t\\n < file | sort -u | wc -l

または猫を無駄に使用するのが好きで、接続オプションが気に入らない場合:

cat file | tr -c -d \\t\\n | sort -u | wc -l

秘密は、各行からタブ以外の文字をすべて削除してから、残りの内容をソート/統合することです。

答え3

正直なところ、最も簡単な方法は以下を使用することですawk

awk -F'\t' '{print NF-1}' foo

NFはフィールド数であり、タブ数がフィールド数よりも少なくなるようにタブ内のフィールドを分割するように-F'\t'指示します。これが私たちが印刷を使用する理由です。awkawkNF-1

本当に使いたくないならawkこんなこともできます(メモ:各行末の末尾のタブは計算されません。

$ while read line; do echo "$line" | fold -1 | grep -c $'\t'; done < foo
2
4
0
1
0

先行タブと末尾タブとバックスラッシュなどの他の奇妙な文字を処理するには、代わりに次のようにします。

$ while IFS= read line; do echo "$line" | fold -1 | grep -c $'\t'; done < foo
  • while read lines; do ... ; done < foo:ファイルの各行をfoo変数として読み込みます$line
  • echo "$line" | fold -1:折りたたみコマンドは、1行に1文字を印刷します。
  • grep -c $'\t'$lineファイル()の各行に対して動作しますが、1 $line行に1文字に縮小されるため、そのgrep -c行のタブ数が計算されます。fold最初に計算しないと、grep -c一致する行の数だけがカウントされ、タブ数は提供されません。すべてワイヤー。

もちろんPerlを使うこともできますが、それも使えないようです。とにかく1つの方法は次のとおりです。

perl -lne '@a=/\t/g;print scalar @a' foo 

答え4

あまりにも遅く気づきましたが、OPのコマンドラインはほぼ正確でした。 TABの前に$( '\ t')を付けるだけです。

grep -o $'\t' infile | wc -l

彼が追いかけたのはまさに何だったのか。

関連情報