如何在bash中的awk内动态比较变量?

Posted

技术标签:

【中文标题】如何在bash中的awk内动态比较变量?【英文标题】:How to compare variable dynamically inside awk in bash? 【发布时间】:2013-12-31 22:43:02 【问题描述】:

我想动态比较两个变量的值并将答案写入文件:

#!bin/bash
Timestamp2="19:16:35"

cat find_thread |awk -F'.' 'print $1'|awk 'for (i=1; i<=NF;i++) if ( $i == $(Timestamp2)  ) print (i-1)'>ThreadID

其中find_thread文件有以下内容:

8361 19:16:35.493540
8361 19:16:35.493594
8360 19:16:41.242314
8360 19:16:41.242343
8278 19:16:39.179931
8278 19:16:39.179973

【问题讨论】:

【参考方案1】:

如果我理解正确的话,请看:

awk -v ts="$Timestamp2" '$2 ~ "^" ts print $1' find_thread > ThreadID

解释:

使用-v 标志将$Timestamp2 放入变量ts。 按模式过滤:$2 ~ "^" ts = 第二列(例如19:16:35.493540)应以ts 开头 打印匹配行的第一列

这是同一事物的另一个变体:

awk -F'[ .]' -v ts="$Timestamp2" '$2 == ts print $1' find_thread > ThreadID

【讨论】:

你不想要cat find_thread | awk ... &gt; ThreadID,你总是想要awk ... find_thread &gt; ThreadID @PaulEvans 部分原因是我认为她可能会在ps 的管道中使用它,部分原因是我很懒……但你说得对,我现在修好了。 措辞优美的问题和一个非常好的解释答案。 +1 给你们两个 :) 不客气。你没有看到很多完美的答案:-)。

以上是关于如何在bash中的awk内动态比较变量?的主要内容,如果未能解决你的问题,请参考以下文章

Bash:如何消除字符串中的所有数字字符,但保留括号内的字符?

Bash shell在while循环后“清除”一个变量,如何获取变量内文件夹中的所有文件? [复制]

bash 中的 awk 命令:如何停止添加新行?

在 BASH 脚本中使用“awk”将列添加到 CSV 文件的末尾

shell awk如何输出文件的指定列

AWK/BASH:如何将一个文件中的字段与另一个文件中的字段匹配?