【发布时间】:2021-03-13 18:48:11
【问题描述】:
我想遍历每行都有一个名称的文件目录,并将其作为查询参数输入到 python 脚本,该脚本查询 SQLite 数据库和一些 API,然后输出一个城市。
我使用它来获取与文本文件中的名称相对应的城市列表:
for file in *.txt; do while read -r name; do python3 citysearch.py "$name"; done < "$file"; done
现在我想在一个巨大的 citynames.txt 文件中对每个城市(python 脚本的输出)进行 grep,并仅输出/保存与文件中包含的城市相对应的名称。
如果我只是通过管道连接到 grep,$name 变量就会丢失。 所以我用 xargs 试了一下:
for file in *.txt; do while read -r name; do python3 citysearch.py "$name"; done < "$file"; done | xargs -0 -I % sh -c 'if grep -Fxq % /home/citynames.txt; then echo $name, $city; fi' sh
但这给了我
sh: 2: city1: not found
sh: 3: city2: not found
...
sh: 10: /home/citynames.txt: Permission denied
我想我不能在 grep 之后的输出中使用 $name 或 $city 变量?我可以以某种方式在管道中存在的 bash 行中设置全局变量吗?
编辑:按照@charles-duffy 的要求,这是文件的最小版本:
citysearch.py 仅将名称作为参数并在输出中添加“城镇”:
#!/usr/bin/env python3
import sys
name = sys.argv[1]
print(str(name) + 'town')
names1.txt 带有一些名称:
name1
name12
name13
names2.txt 与其他一些名称:
name2
name22
name23
citynames.txt 包含有趣的城市:
name22town
name22city
现在我想遍历 names*.txt 文件并获取
name22, name22town
因此,因为 name22 是与 citynames.txt 文件中包含的城市相对应的唯一名称。
【问题讨论】:
-
citysearch.py文件的输出格式是什么? -
...我不清楚您在这里实际尝试做什么。提供一个没有您的 Python 脚本的人可以运行的测试用例会使事情变得更容易(既可以编写答案,也可以确定其他人运行的建议答案是否正确)。
-
citysearch.py 的输出只是一个城市名称,例如“Paris”。对于一个测试用例,想象一下 python 脚本将一个字符串添加到名称中,并且必须在 citynames.txt 中找到该结果。
-
将 Python 脚本中的城市输出输出到单独的文件,然后使用该文件进行 grep 搜索以搜索条目可能会更容易和更有效。
-
@RamanSailopal 那,或者使用
comm一次性合并这两个文件。