フォルダー内にいくつかのコンマで削除されたファイルがあります。線はこんな感じ…
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15
すべてのファイルには、正確に5つの列があると想定されています。ただし、上記のように1行またはすべての行が5行未満のファイルがいくつかあります。そのようなファイルの名前を知るにはどうすればよいですか?
すべての行に正確に4つのコンマが含まれている場合、問題はなく、そのようなファイルはOKと見なされます。
この行(find + awk)は機能しますか?
find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{print FILENAME;exit;}' {}
ファイルの拡張子が「txt」であると想定します
アップデート
OPは行番号を必要としています:
kent$ head *.txt
==> 4.txt <==
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15
==> one.txt <==
1,2,3,4,5
6,7,8
9,10
11,12,13,14,15
==> three.txt <==
11,12,13,14,15
==> two.txt <==
11,12,13,14,15
kent$ find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{print FILENAME,NR}' {}
./one.txt 2
./one.txt 3
./4.txt 2
./4.txt 3
再度更新する
OP、質問をより明確に説明する必要があります。
したがって、合計行番号(合計)が必要です。
kent$ find . -name *.txt |xargs -I{} awk -F',' 'NF!=5{a[FILENAME]++;} END{if(a[FILENAME]) print FILENAME, a[FILENAME]}' {}
./one.txt 2
./4.txt 2
次のようなものです(注:これは5つの列があることを確認します-4つ,
の列があることではありません):
import gzip
from glob import iglob
import csv
for filename in iglob('*.gz'): # or get filenames from wherever
with gzip.open(filename) as fin:
if not all(len(row) == 5 for row in csv.reader(fin)):
print filename
この拡張grepコマンドは機能するはずです。
grep -vEl '^[^,]+(,[^,]+){4}$'
ファイルがgzipで圧縮されている場合は、zgrepを使用できます。
zgrep -vEl '^[^,]+(,[^,]+){4}$'
Pythonの場合:
def fileIsGood(filename):
for line in open(filename):
if len(line.split(",")) != 5:
return False
return True
fileNames = ["foo.txt", "bar.bat", "baz.exe"]
for fileName in fileNames:
if not fileIsGood(fileName):
print fileName
私は各行でcount
を数えるために使用します:','
import gzip
def is_good(fname):
with gzip.open(fname,'r') as f:
return all( line.count(',') == 4 for line in f )
#somehow get filenames. Here I'll assume glob
good_files = [ fname for fname in glob.glob('*.gz') if is_good(fname) ]
# or if you like functional programming:
#good_files = filter(is_good, glob.glob('*.gz'))
import os
def check_file(name):
with open(name, 'r') as f:
while line = f.readline():
if line.count(',') != 4:
return False
return True
def check(path):
return [filename for filename in os.listdir(path) if not check_file(filename)]