すべての.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"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

もう一つのアプローチはawk実装:

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

関連情報