【问题标题】:Using file redirects to input a variable search pattern to awk使用文件重定向将变量搜索模式输入到 awk
【发布时间】:2015-07-23 17:52:15
【问题描述】:

我正在尝试用 bash 编写一个小脚本。该脚本的目的是从 file1.txt 中提取搜索模式,并从 file2.txt 中打印匹配搜索的行号。我知道我想要的模式在 file1.txt 中的确切位置,我可以使用 sed 和 awk 轻松地将其拉出来,例如

sed -n 3p file1.txt | awk '{print $4}'

我遇到问题的部分是将该信息再次传递给 awk 以用作 file2.txt 中的搜索模式。大致如下:

awk '/search_pattern/{print NR}' file2.txt

通过将第一行的输出存储为变量,然后将该变量传递给第二行中的 awk,我能够让这段代码在两行代码中运行,

myVariable=`sed -n 3p file1.txt | awk '{print $4}'`
awk '/'"$myVariable"'/{print NR}' file2.txt

但这似乎“不雅”。我希望有一种方法可以在一行代码中使用文件重定向(或类似的东西?)。非常感谢任何帮助!

【问题讨论】:

  • 请提供示例file1.txtfile2.txt 以及您期望的输出。

标签: awk


【解决方案1】:

你可以用

避免sed | awk
awk 'NR==3{print $4; exit 0}' file1.txt

您可以通过以下方式进行搜索:

search=$(awk 'NR==3{print $4; exit 0}' file1.txt)
awk -v search="$search" '$0 ~ search { print NR }' file2.txt

您甚至可以将所有内容写在一行上,但我不建议这样做;清晰比简洁更重要。

原则上,您可以使用:

awk 'NR==3{search = $4; next} FNR!=NR && $0 ~ search {print NR}' file1.txt file2.txt

这会扫描file1.txt 并找到搜索模式;然后它扫描file2.txt 并找到匹配的行。一条线——甚至还算清晰。如果file1.txt 的第 3 行没有第 4 列,将会有很多匹配项。

【讨论】:

  • 太好了,非常感谢!假设我想从命令行而不是在我的脚本中使用它。它看起来会不会是:awk -v search=$(awk 'NR==3{print $4}' file1.txt) '$0 ~ search {print NR}' file2.txt
  • 命令行中的使用看起来与脚本中的使用相同。是的,您的单行代码是将第一个 awk 合并到第二个命令行的正确方法。您可以逐字写出一两行,或者根据需要调整常量 (3, 4)。我认为最后一个选择更好。使用一个没有重大扭曲的命令而不是两个或三个通常会更好。
猜你喜欢
  • 2016-07-28
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2020-01-15
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多