0

我有一个要求。我正在编写 awk 脚本,我的输入文件是

TIME FIELD : SOME FIELDS SOME FIELDS Some fields Some fields RID ..

RID 的出现是随机的,它从一条记录到另一条记录有所不同,因此问题是我将无法使用 NR 和 $1 概念,因为不能保证 RID 会在此特定行中发生

我需要同时提取时间字段和 RID。我可以在两个文件遍历中做到这一点,但任何想法如何使用 awk 在单个文件遍历中做到这一点。谢谢

4

2 回答 2

0

在 AWK 中执行此操作(假设时间字段中没有任何空格或冒号):

awk -F '[: ]' '{for (i = 2; i <= NF; i++) {if ($i ~ /^RID/) {rid = $i}}; print $1, rid}' inputfile

仅使用没有显式循环的正则表达式:

awk -F ':|RID=' '{split($3, a, " "); print $1, "RID=" a[1]}'
于 2012-07-02T19:10:56.923 回答
0

像这样的东西可以工作:

sed 's,^\([^:]*\):.*\(RID=[[:alnum:]]*\).*$,\1 : \2,'

它要求 TIME FIELD 不包含任何冒号,所以如果是这种情况,请指定一个具体示例。

我正在玩这个输入:

$ echo 'TIME FIELD : SOME RID=62 FIELDS SOME FIELDS Some fields Some fields
TIME FIELD : SOME FIELDS SOME FIELDS Some fields Some fields RID=012
TIME FIELD : SOME FIELDS RID=5672 SOME FIELDS Some fields Some fields
TIME FIELD : SOME RID=62 FIELDS SOME FIELDS Some fields Some fields' | 
    sed 's,^\([^:]*\):.*\(RID=[[:alnum:]]*\).*$,\1 : \2,'
TIME FIELD  : RID=62
TIME FIELD  : RID=012
TIME FIELD  : RID=5672
TIME FIELD  : RID=62
于 2012-07-02T17:44:32.463 回答