grep/awk 基于特定字段的特定行;在 awk 中使用 ksh 变量

grep/awk specific lines based on specific fields; using ksh variable with awk

我有这个输入文件:file_in.txt(用竖线分隔)

3345:tyg|rty|27|0|0|ty6|{89|io|}62|0
3346:tyg|rtyuio|63|0|1|ty6|{89|gh|}45|0
3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0
3348:tyg|rtoy|93|0|1|ty6|{89|yh|}1|0
3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0

我只想获取第 9 个字段值为 }27 的行,使用 '|' 作为分隔符,这样我的输出应该是:

3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0
3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0

以下命令工作正常:

awk -F"|" '{ if ( == "}27") print [=13=] }' file_in.txt

但是我想使用 shell 变量而不是 "}27" 我试过这个:

taskid="}27"    
awk -v tid="$taskid" -F"|" '{ if ( == "}tid") print [=14=] }' file_in.txt

请帮我找出这个命令哪里出错了。 任何其他实现相同目的的命令建议都表示赞赏。

这应该有效:

taskid="}27"

awk -F'|' -v tid="$taskid" ' == tid' file

输出:

3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0
3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0

您自己的命令应该适用于此更改:

$ ksh
$ taskid=}27
$ awk -v tid=$taskid -F"|" '{ if ( == tid) print [=10=]}' file_in.txt

Output:
3347:tyu|ray|24|0|0|ty6|{89|uh|}27|0 3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0

假设您的 shell 变量 $tasked 的值为 27,您想使用以下形式之一:

  1. 用 shell

    中的左大括号构建字符串
    awk -v tid="}$taskid" -F"|" ' == tid' file
    
  2. 或者在 awk 中完成 --- awk 的字符串连接只是将字符串并排放置,中间有可选的空格

    awk -v tid="$taskid" -F"|" ' == "}" tid' file