【问题标题】:if result of "python3 script.py $parameter" is in file.txt, output parameter,result - how to do this?如果“python3 script.py $parameter”的结果在 file.txt、输出参数、结果中 - 怎么做?
【发布时间】: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 一次性合并这两个文件。

标签: bash pipe xargs


【解决方案1】:

将问题中给出的错误 Python 脚本替换为等效的 sed 操作,得到:

#!/usr/bin/env bash
for file in names*.txt; do
  while IFS= read -r name; do
    while IFS= read -r city; do
      echo "$name, $city"
    done < <(sed -e 's/$/town/' <"$file" | grep -Fx -f citynames.txt)
  done < "$file"
done

【讨论】:

  • @riveratheera,查看编辑——用缺少错误的sed 行替换Python 脚本,并使用-f 参数到grep,所以它从citynames.txt 读取行, 而不是 grepping 确切的字符串 citynames.txt。 (也开始搜索names*.txt 所以citynames.txt 可以在同一个目录中)。
  • 谢谢,但我提供了 Python 脚本的最小版本,只是为了便于复制。恐怕我不能用 sed 替换真正的 python 脚本(它查询 SQLite 数据库和一些 API,如上所述)... python 脚本超出范围:) 正如我在您的其他评论中解释的那样,如果您只是将示例中的最小 python 脚本运行为“python3 citysearch.py​​ bla1”,那么它应该可以工作。
  • @riveratheera,是的,但是 provided python 脚本示例没有按照您的要求执行,并且它的输出是您的示例数据永远不会匹配的内容。无论如何,我不会告诉你在你的真实代码中使用sed。我要求您在您的真实代码中使用 实际将真实城市名称写入标准输出的东西,普通 Python 不这样做,但 sed 可以。如果您真正的 Python 没有问题,那么您可以使用您的真正 Python 而无需替换或更改它。
猜你喜欢
  • 2016-11-10
  • 2011-04-02
  • 2020-12-23
  • 1970-01-01
  • 2013-01-13
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多