在单个文件遍历中提取特定字段

时间:2012-07-02 17:21:48

标签: shell awk

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]}'