我对命令行搜索方法有疑问。这是我的情况。
我有一个数据文件,其中包含一堆(~36,000)个对象的标识号,如下所示:
# ID
85000213
85000234
85000246
85000247
85000249
85000250
...
我还有一个数据文件目录,其中包含有关每个对象的数据,其名称如下:
datafileID85000213.csv
datafileID85000234.csv
datafileID85000246.csv
datafileID85000247.csv
datafileID85000249.csv
datafileID85000250.csv
...
我实际上想检查原始ID数据文件中的所有对象是否都有一个包含其实际数据的关联CSV文件。我这样做的第一个想法是使用diff命令来比较这些列表,但为了做到这一点,我需要从我拥有的~36,000个CSV文件名中创建一个列数据文件,以便进行比较。一个复杂的问题是,到目前为止我尝试使用的大多数命令(mv,cp,ls),我得到了这个:
参数列表太长
任何人都有一个解决方法(或更好的主意)来完成这项任务吗?
为了搜索每个文件名字符串中的数字,到目前为止我找到了两件事之一:
蟒:
>>> 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']
任何帮助将不胜感激!
答案 0 :(得分: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
的文件是否存在。
答案 1 :(得分: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
答案 2 :(得分: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。
答案 3 :(得分:0)
这适用于40000个文件:
diff <( ls -1 *.csv | cut -c11-18 ) <( tail -n +2 idlist ) | grep '^>' | cut -d' ' -f2
输出类似于
80001234
80004321