【问题标题】:Grepping/awking assigned $variableGrepping/awking 分配了 $variable
【发布时间】:2015-02-10 23:37:33
【问题描述】:

是否可以在分配的 $variable 中使用 awk grep 字符串或比较字段。

例如

grep "word" "$foo"

只列出$foo的完整内容。

awk 命令不识别变量,但在我的文件夹中搜索文件:

awk 'FNR==NR{a[$1]++;next}a[$1]' "$foo" "$fee"

它说 awk: fatal: cannot open file `$foo' for reading (No such file or directory)

@BMW 建议提供更多详细信息。他们来了: 这是完整的命令:

foo=$(cat my_text.txt |  grep -B5 'application' | paste -s --delimiters=" " |sed 's/--/\n/g'| awk '{print $1 " " $2 " " $3 " " $4 " " $5}')

这是 $foo 的输出和内容。

  • reaction_1 jj-cju 2 应用程序
  • reaction_1 jj-cju 2 应用程序
  • reaction_1 jj-cjo 2 应用程序
  • reaction_4 jj-cji 2 应用程序
  • reaction_5 jj-cju 2 应用程序
  • reaction_5 kk-cju 2 应用程序
  • reaction_7 jj-cju 2 应用程序
  • reaction_7 kk-cji 2 应用程序
  • reaction_7 kk-cji 2 应用程序
  • reaction_7 kk-cju 2 应用程序
  • reaction_7 mm-cju 2 应用程序

【问题讨论】:

  • 运行echo $foo,输出是什么?
  • 它显示 $foo 的内容,它是一个单词列表。
  • 单词列表?好的,这不是文件名。您需要将文件名分配给变量foo
  • 听起来你可能走上了一条好路。这就是将我以前的命令的竞争分配给 $foo 的方式: foo=$(cat my_text.txt | paste -s --delimiters=" " |sed 's/--/\n/g' | awk '{打印 $1 " " $2 " " $3 " " $4 " " $5}')
  • 那么为什么不直接粘贴my_test.txt 的一些内容示例,以及 $fee 中的内容。您在上面粘贴的命令质量太差。你不应该混合使用 `paste/sed/awk',我们应该有简单的方法来做到这一点。

标签: bash shell variables awk


【解决方案1】:

您可以使用herestring 代替文件名来做到这一点:

grep "word" <<< "$foo"

如果您的命令只需要一个输入文件/变量,这将起作用。如果您需要多个,例如您的示例awk 命令,则需要使用process substitution

awk 'FNR==NR{a[$1]++;next}a[$1]' <(echo "$foo") <(echo "$fee")

&lt;(...) 构造运行内部命令,然后将输出视为文件。

例子:

$ echo "$foo"
first line
second line
last one

$ echo "$fee"
example
text

$ grep "line" <<< "$foo"
first line
second line

$ grep "last" <(echo "$foo")
last one

$ awk '{print NR": "$0}' <(echo "$foo") <(echo "$fee")
1: first line
2: second line
3: last one
4: example
5: text

【讨论】:

  • 太好了,&lt;&lt;&lt;&lt;(...) 成功了。感谢@Josh Jolly 的建议。
【解决方案2】:

如果您使用 awk 进行单词搜索,请使用:

awk -v w="word" '$0 ~ w' "$foo"

假设$foo 是一个文件。

你甚至可以使用:

awk '/word/' "$foo"

【讨论】:

  • 我猜这不是 OP 所要求的...他的问题是 awk: fatal: cannot open file $foo for reading (No such file or directory)
  • 但他也说grep 命令正在使用与文件名相同的$foo
  • 是的,这就是重点。看看他的 grep 和 awk cmd,如果 grep 扩展了 $foo,awk 也应该这样做,但它并没有发生在那里。我猜他的代码中还有其他错误,但不知道是什么..
  • 你是对的 Kent,这里有一个错误,因为 grep 命令只复制了赋值变量 $foo 的内容。我在这里尝试过建议的命令——还有 awk 命令——但结果是一样的。我想我现在知道为什么 awk: 发生致命错误了。我应该把我的变量放在双引号下。当我这样做时,错误消失了。然而,结果仍然只是第一个变量的内容。
  • 那么$foo 只是一个字符串变量还是它存储了一个文件名?
猜你喜欢
  • 2022-09-24
  • 2015-06-05
相关资源
最近更新 更多