grep -v問題は、1000を超えるファイルの行数(1行数)を取得します。

grep -v問題は、1000を超えるファイルの行数(1行数)を取得します。

VCFファイルにこのコマンドを使用する必要があります。

grep -v "#" {name of VCF file} | wc -l

これは "#" のない行数を提供します。

しかし、私の問題は、私のディレクトリに多くのファイルがあり、個々の行数が必要であるということです。したがって、「#」を持たない各ファイルの行数が必要です。

私がするとき:grep -v "#" *.vcf* | wc -lパイプは#なしですべてのファイルの行を合計します。各ファイルの行数を個別に知る必要があります。各ファイルの行を手動でパイプすることはできません(ファイルは千を超えています)。誰でも各ファイルの行数を取得する方法を提案できますか?よろしくお願いします!

ベストアンサー1

grep -cパイプの代わりに使用してくださいwc -l

grep -c -v -- '#' *.vcf

現在のディレクトリにvcfファイルが1つしかない場合、その名前は出力されず、数だけがインポートされます。

grepこの問題を解決するには、GNU実装または互換性を介してこの-Hオプションを追加するだけです。

grep -Hcv -- '#' *.vcf

/dev/null他の実装では、いつでもリストに追加してtail -n +2パイプを介して削除できます。

grep -c -v -- '#' /dev/null *.vcf | tail -n +2

(サポートされているシェルオプションを設定しないと、プロセスは終了grepステータスを失いますが)。pipefail

一方、ファイル名なしで各数だけが必要な場合は、-h代わりにGNUを使用する-Hか、サポートされていない実装を含むループを使用してくださいgrepgrep-h

for file in *.vcf; do grep -cv '#' < "$file"; done

または、完全終了ステータスとともに失敗を報告します。

(
  ret=0
  for file in *.vcf; do
    grep -cv '#' < "$file" || ret=$?
  done
  exit "$ret"
)

あなたが得る場合パラメータリストが長すぎます。grepエラー、次のツールを使用してリストを複数の呼び出しに分割できますxargs(ここではGNUツールと仮定)。

printf '%s\0' *.vcf | xargs -r0 grep -cvH -- '#'

またはzsh一緒に使用する場合zargs

autoload zargs
zargs -r -- *.vcf(Nn.) -- grep -cvH -- '#'

(これはglob修飾子機能を使用して通常のファイル(.)に制限し、ファイルリストに数値ソート順序を使用し(n)vcfファイルがない場合のエラーを防ぎます(-rwith N)。

おすすめ記事