0

フォルダー内にいくつかのコンマで削除されたファイルがあります。線はこんな感じ…

1,2,3,4,5
6,7,8
9,10
11,12,13,14,15

すべてのファイルには、正確に5つの列があると想定されています。ただし、上記のように1行またはすべての行が5行未満のファイルがいくつかあります。そのようなファイルの名前を知るにはどうすればよいですか?

すべての行に正確に4つのコンマが含まれている場合、問題はなく、そのようなファイルはOKと見なされます。

4

6 に答える 6

2

この行(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
于 2012-09-20T12:36:50.467 に答える
1

次のようなものです(注:これは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
于 2012-09-20T12:49:04.060 に答える
0

この拡張grepコマンドは機能するはずです。

grep -vEl '^[^,]+(,[^,]+){4}$'

ファイルがgzipで圧縮されている場合は、zgrepを使用できます。

zgrep -vEl '^[^,]+(,[^,]+){4}$'
于 2012-09-20T12:37:20.040 に答える
0

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
于 2012-09-20T12:32:01.087 に答える
0

私は各行で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'))
于 2012-09-20T12:35:47.497 に答える
0
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)]
于 2012-09-20T12:36:42.980 に答える