【问题标题】:Extracting information within a column提取列中的信息
【发布时间】:2013-06-10 15:13:08
【问题描述】:

我正在尝试提取由制表符分隔的数据子集。我想在专栏中使用一些信息。例如 column2 有三个分数,用“;”隔开

col1 col2
1    a=2;b=1.1;c=0    
1    a=0.2;b=0.2;c=0.5  
1    a=1.5;b=1.9;c=3.5  

我想提取 b 值大于 1 的行。在这种情况下,我想要的输出是

col1 col2
1    a=2;b=1.1;c=0    
1    a=1.5;b=1.9;c=3.5  

我尝试使用 awk,但无法在列中提取信息。此外,顺序并不总是相同(a、b、c 等)。最好在搜索条件中包含“b > 1”。有什么建议吗?

【问题讨论】:

    标签: unix awk extract vcf-vcard


    【解决方案1】:

    由于 Column2 的顺序可以是随机的,你可以这样做:

    awk -F'\t' '
    NR>1 {
        split($2,ary,/[;=]/); 
            for (i=1;i<=length(ary);i++) { 
                if (ary[i]=="b" && ary[i+1]>1) {
                    print $0 
                }
            }
        next
    }1' file
    

    测试:

    $ cat f
    col1    col2
    1       a=2;b=1.1;c=0    
    1       a=0.2;b=0.2;c=0.5  
    1       a=1.5;b=1.9;c=3.5  
    
    $ awk -F'\t' '
    NR>1 {
        split($2,ary,/[;=]/); 
            for (i=1;i<=length(ary);i++) { 
                if (ary[i]=="b" && ary[i+1]>1) {
                    print $0 
                }
            }
        next
    }1' f
    col1    col2
    1       a=2;b=1.1;c=0    
    1       a=1.5;b=1.9;c=3.5  
    

    【讨论】:

    • 感谢@Jaypal。这是工作。但是 NR 是否需要为 0 以便它也包括第一行?我只是尝试了一组不同的数据,但它错过了第一个条目。我将其更改为 0,它似乎工作正常。 NR 是做什么的?
    • NR 存储被测文件的行号。在我们的例子中,第一行是标题。由于我们不想在标题上进行拆分并按原样打印,因此整个操作在NR&gt;1 上完成,这实质上意味着 - 不理会我的标题行并在所有剩余的行上执行此操作。最后的1 将按原样打印我们的标题行。如果您的主文件中没有第一行作为标题,那么您可以将其完全删除。在这种情况下,您还可以删除 next1。它们都是为了打印标题行而添加的。
    • 您不需要为每个字段调用length(ary)Spilt 为您返回此内容。 n=split($2,a,/;=/); for(i=1;i&lt;=n;i++)
    • 谢谢@Jaypal。完美运行
    【解决方案2】:

    GNU sed

    sed -r '/b=0.[0-9]?|b=1.0|b=1([^0-9.]|$)/d' file
    

    【讨论】:

    • @user1007742 它找到所有带有b&gt;1 的行并将其显示在屏幕上。您需要什么信息?
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多