各ファイルの列数とともに、ディレクトリ内のすべての.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 }"
。DIRECTORY
SEPARATOR