使用awk在字符串后选择字段

使用awk在字符串后选择字段,awk,Awk,我是awk的新手,刚刚在周末被介绍过。 我有一个问题,希望有人能帮助我 如何选择特定字符串后面的字段 如何展开此代码以选择特定字符串后面的多个字段 例如,对于文本文件中的任何给定行,我有如下内容 2 of 10 19/4/2014 school name random text distance 800m more random text time 2:20:22 winner someonefast. 有些属性非常一致,因此我可以轻松提取这些字段。例如2、10和日期。然而,在我想要提取的下

我是awk的新手,刚刚在周末被介绍过。 我有一个问题,希望有人能帮助我

如何选择特定字符串后面的字段

如何展开此代码以选择特定字符串后面的多个字段

例如,对于文本文件中的任何给定行,我有如下内容

2 of 10 19/4/2014 school name random text distance 800m more random text time 2:20:22 winner someonefast. 
有些属性非常一致,因此我可以轻松提取这些字段。例如2、10和日期。然而,在我想要提取的下一个字段之前,通常有很多可变文本。这就是问题所在。使用awk可以提取字符串后面的下一个字段吗?例如,我对/distance/或/time/字符串后面的字段以及$1、$3、$4、$5感兴趣

非常感谢你的帮助


Andy

使用
awk
可以选择字符串后面的字段。以下是一个例子:

echo '2 of 10 19/4/2014 school name random text distance 800m more random text time 2:20:22 winner someonefast.' |
awk '{
    for(i=1; i<=NF; i++) {
        if ( i ~ /^[1345]$/ ) {
            extract = (extract ? extract FS $i : $i)
        }
        if ( $i ~ /distance|time/ ) {
            extract = (extract ? extract FS $(i+1): $(i+1))
        }
    }
    print extract
}'
2 10 19/4/2014 school 800m 2:20:22
echo'2014年4月19日第2期学校名称随机文字距离800米随机文字时间2:20:22赢家someonefast'|
awk'{
对于(i=1;iBasic:

但是,仅获取所有其他重要文本是不够的,这些文本在
$5
之后仍然是学校名称的一部分。您应该添加另一个条件


更好的解决方案是在制表符等空格之外使用另一个分隔符,并将
\t
用作
FS

当您在这里遇到名称=值的情况时,最好创建一个数组,将名称映射到值,然后只打印您感兴趣的名称的值,例如:

$ awk '{for (i=1;i<=NF;i++) v[$i]=$(i+1); print $1, $3, $4, $5, v["distance"], v["time"]}' file
2 10 19/4/2014 school 800m 2:20:22

$awk'{for(i=1;i您想要的输出是什么样子的?您自己尝试过什么吗?如果是,您应该将其包含在问题中,并突出显示您在使用它时遇到的任何具体问题。期待着先尝试此项:)“我也会试试这个。”jaypal因为你总是对习惯的awk方法感兴趣,请看我刚刚发布的答案。
2 10 19/4/2014 school 800m 2:20:22
$ awk '{for (i=1;i<=NF;i++) v[$i]=$(i+1); print $1, $3, $4, $5, v["distance"], v["time"]}' file
2 10 19/4/2014 school 800m 2:20:22