【问题标题】:grep/awk specific lines based on specific fields; using ksh variable with awk基于特定字段的 grep/awk 特定行;将 ksh 变量与 awk 一起使用
【发布时间】:2016-08-14 23:54:01
【问题描述】:

我有这个输入文件: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 ($9 == "}27") print $0 }' file_in.txt

但我想使用 shell 变量而不是 "}27",我对此进行了尝试:

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

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

【问题讨论】:

  • 你试过的命令的输出是什么?

标签: bash shell awk grep ksh


【解决方案1】:

这应该可行:

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
【解决方案2】:

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

  1. 在 shell 中用左大括号构建字符串

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

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

【讨论】:

    【解决方案3】:

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

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

    输出:
    3347:tyu|射线|24|0|0|ty6|{89|uh|}27|0 3349:tyo|rtert|28|0|0|ty6|{89|gh|}27|0

    【讨论】:

    • 我希望将$9 匹配到}tid 而不是tid...所以这不起作用。
    • 我不确定您的要求有什么变化。但是我指出的那个没有理由不工作。为了根据您的要求明确我想解决的问题,我添加了一些额外的行。
    • 现在它工作正常...我从另一个命令而不是}27 得到taskid }27 所以格伦建议的答案似乎更合适...但是这个编辑的版本也适用好的..谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 2013-02-10
    • 1970-01-01
    • 2018-08-25
    • 2013-02-04
    • 2015-09-13
    • 2019-08-20
    相关资源
    最近更新 更多