タブリストファイルがあります。各行のタブ数が同じであることを確認したいと思います。
最初のステップとして、1行あたりのタブ数を印刷したいと思います。
私はそれを試しましたが、grep -o '\t' infile | wc -l
私の実装はgrep
次のとおりですgrep: invalid option -- o
。別の方法がありますか?
良い点:可能であれば、個人的な好みのためにこれを行うには、util(grep、catなど)ツールを使用することをお勧めします。いいえ awk
またはbashスクリプト。
答え1
sed
etcはこれには適していないと思います。簡単な方法は、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'
指示します。これが私たちが印刷を使用する理由です。awk
awk
NF-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
彼が追いかけたのはまさに何だったのか。