すべての.txtファイルを一覧表示し、列数を数えます。

すべての.txtファイルを一覧表示し、列数を数えます。

各ファイルの列数とともに、ディレクトリ内のすべての.txtファイル(パイプ区切りファイル)をどのように一覧表示できますか?

答え1

find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
  FNR == 1 {print FILENAME ": " NF; nextfile}' {} +

次のようなものを印刷します

./dir/foo.txt: 2

.txt名前がwhereで終わるすべての空でない通常のファイルの場合、ここでは"2"ファイルの最初の行にある区切りフィールドの数です。|

nextfileこれは、すべての実装で使用できるわけではありませんが、awk使用できない場合は無害でなければなりません(awk ファイルを完全に読み取るため効率が悪くなります)。

空でないすべての行で同じ数の列を持つファイルのみを考慮するには、GNUを使用してくださいawk

find . -name '*.txt' -type f -size +0 -exec awk -F '|' '
  BEGINFILE {n = 0}
  NF {
    if (n && NF != n) {
      print "skipping "FILENAME" ("NF" != "n")" > "/dev/stderr"
      n = 0; nextfile
    }
    n = NF
  }
  ENDFILE {if (n) print FILENAME ": " n}' {} +

答え2

もう一つの方法はどんな場合でも機能します。アッ実装する:

find . -type f -name "*.txt" -exec awk -F'|' 'NF{ print FILENAME,NF; exit }' {} \;

  • -F'|'-|フィールド区切り文字として扱われます。
  • NF{ ... }- ファイルにフィールド/列が少なくとも1つあることを確認してください。NFそれ自体は列番号を指します。

答え3

find . -name "*.txt" -type f -exec wc -l {} \;

答え4

あなたの質問は明確ではありませんが、次のコマンドを試してみることができます。ディレクトリと列の区切り記号を置き換えますfind DIRECTORY -name "*.txt" | xargs awk -F "SEPARATOR" "{print FILENAME, NF }"DIRECTORYSEPARATOR

関連情報