1

我对命令行搜索方法有疑问。这是我的情况。

  1. 我有一个数据文件,其中包含一堆(~36,000)对象的标识号,如下所示:

    # ID
    85000213
    85000234
    85000246
    85000247
    85000249
    85000250
    ...
    
  2. 我还有一个数据文件目录,其中包含有关每个对象的数据,其名称如下:

    datafileID85000213.csv
    datafileID85000234.csv
    datafileID85000246.csv
    datafileID85000247.csv
    datafileID85000249.csv
    datafileID85000250.csv
    ...
    

我实际上想检查我的原始 ID 数据文件中的所有对象是否都有一个包含其实际数据的关联 CSV 文件。我这样做的第一个想法是使用 diff 命令来比较这些列表,但为了做到这一点,我需要从我拥有的 ~36,000 个 CSV 文件名中创建一个单列数据文件以便进行比较。一个复杂的问题是,对于我迄今为止尝试使用的大多数命令(mv、cp、ls),我得到了这个:

参数列表太长

有人会对这项任务有解决方法(或更好的主意)吗?

为了在每个文件名字符串中搜索数字,到目前为止我发现了两件事之一:

  1. Python:

    >>> import re
    >>> idlist
    ['abcdefg0.dat', 'abcdefg1.dat', 'abcdefg2.dat', 'abcdefg3.dat', 'abcdefg4.dat', 'abcdefg5.dat', 'abcdefg6.dat', 'abcdefg7.dat', 'abcdefg8.dat', 'abcdefg9.dat']
    >>> numbers = []
    >>> for i in range(len(idlist)):
    ...     numbers.append(re.search(r'\d+',idlist[i]).group())
    ... 
    >>> numbers
    ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    
  2. bash:UNIX BASH:从字符串中提取数字

任何帮助将不胜感激!

4

4 回答 4

3

来自bash

{
   # Read the header into a variable, but ignore it
   read -r hdrLine
   while read -r fileID; do
      [[ -f $DIRECTORY/datafileID$fileID.csv ]] || echo "$fileID not found"
   done
} < id_list.txt

中的所有内容都{...}从文件中读取id_list.txt。第一条read语句读取并丢弃标题。然后while循环从文件中读取剩余的行,一次一个。设置为文件所在目录的名称(DIRECTORY或替换为硬编码路径,您可以选择),它会检查datafileID$fileID.csv该目录中是否存在名为 的文件。如果是这样,什么都不会发生。否则,将在标准输出中打印一条具有该效果的消息。

您可以使用文件 glob 执行更一般的检查。

[[ -f $DIRECTORY/*$fileID* ]]

将检查名称中包含$fileID任何位置的文件是否存在。

于 2013-06-07T18:34:08.180 回答
2

这在 python 中非常简单:

import os.path
with open('idfile') as fin:
     header = next(fin) #read the `#ID` comment header line.  Don't use it.
     for line in fin:
         fname = 'datafileID{0}.csv'.format(line.strip())
         if not os.path.exists(fname):
             print fname
于 2013-06-07T18:33:01.537 回答
0

这适用于我有 40000 个文件:

diff <( ls -1 *.csv  | cut -c11-18 ) <( tail -n +2 idlist ) | grep '^>' | cut -d' ' -f2

输出类似于

80001234
80004321
于 2013-06-08T11:37:46.727 回答
0

怎么样:

import os
root = '/path/to/files/'
with open('filelist.txt') as f:
    for line in f:
        if not os.path.exists(root+'datafileID'+line.strip()+'.csv'):
            print line

这将打印所有没有匹配文件的 ID。

于 2013-06-07T18:39:31.433 回答