
ディレクトリ内のすべての .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 }"
置き換えるだけです。DIRECTORY
SEPARATOR