【问题标题】:Use bash awk sed to extract text field in file使用 bash awk sed 提取文件中的文本字段
【发布时间】:2015-06-04 08:39:26
【问题描述】:

我有一个这样的文件(奇数行和偶数行有不同的类型内容):

try to upload UI/uploaded/2010.png
[{"index":"1","field":"file","exloc":"MiVip/07fb"}]
try to upload UI/uploaded/2011.png
[{"index":"1","field":"file","exloc":"MiVip/0487"}]

我想要得到的是:

2010.png
MiVip/07fb
2011.png
MiVip/0487

此外,我希望将结果输出到一个数组中(供后面的代码使用)。 我想使用 bash(如果需要,可以使用 awk,sed)来执行此操作。

当我使用 awk 时,我无法找出正确的正则表达式 字段分隔符(我想使用 , space : " [ ] { 和 } 作为字段分隔符,所以最后一个字段就是我想要的)。 最好的答案是为 awk 提供正确的分隔符。

或回退到 sed(将所有 , " [ ] { } 替换为空格)。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    简单的sed:

    sed -e '/^try to upload/s=.*/==; /^\[/{s=.*"exloc":"==;s="}\]==}' 
    

    它使用所谓的“地址”,因此它转换为: 如果该行以“尝试上传”开头,则删除最后一个斜杠之前的所有内容。如果该行以[ 开头,则删除直到"exloc":" 的所有内容,并删除结尾的"}]

    【讨论】:

    • 更进一步,我希望将结果输出到一个数组中(供后面的代码使用)。
    • @cox:输出就是输出。你是什​​么意思?什么编程语言?
    • Bash 编程语言。
    【解决方案2】:

    试试这个 awk 单行代码:

    awk '{c=$0~/\]$/?split($0,a,/"/)-1:split($0,a,/\//);print a[c]}' file
    

    使用您的输入示例,它会输出:

    kent$  awk '{c=$0~/\]$/?split($0,a,/"/)-1:split($0,a,/\//);print a[c]}' file
    2010.png
    MiVip/07fbde4d3abe340e22703f96494bf61e215995e3d
    2011.png
    MiVip/048734395a6442854877102d8f0a16ae4f642eaf8
    

    这种方法使用了 awk 的split() 函数。它检查输入中每一行的最后一个字符,如果它以] 结尾,则以" 分割,并打印array[len-1],否则我们以/ 分割,取数组中的最后一个元素。

    如果您输入的最后一个字符不应作为检查目标,您可以更改$0~/YourPattern/ 以使该行适合您。

    【讨论】:

    • 如何将结果放入数组中,并在 awk 的 END 部分使用该数组进行进一步处理。
    • @cox 然后你不print,将结果放入数组中,例如result[NR]=a[c] 然后在 END 块中进行处理。
    猜你喜欢
    • 1970-01-01
    • 2013-01-07
    • 2020-09-26
    • 2022-01-13
    • 2018-03-31
    • 2012-08-13
    • 2013-11-09
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多