基于特定字段的 grep/awk 特定行;将 ksh 变量与 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

我只想获取那些使用 '|' 作为分隔符}27具有第 9 个字段值的行,以便我的输出应该是:

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 ($9 == "}27") print $0 }' file_in.txt

但是我想使用一个 shell 变量而不是我尝试过的"}27"

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

请帮助我找出此命令出错的地方。赞赏任何其他命令建议来实现相同的目的。

这应该有效:

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

输出:

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. 在外壳中使用开放式大括号构建字符串

    awk -v tid="}$taskid" -F"|" '$9 == tid' file
    
  2. 或者在 awk 中执行此操作--- awk 的字符串连接只是将字符串并排放置,中间有可选的空格

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

您自己的命令应该可以处理此更改:

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

输出:
3347:Tyu|ray|24|0|0|ty6|{89|呃|}27|0 3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0

最新更新