get列包含特定的字符串

时间:2017-03-12 04:18:21

标签: python awk text-processing

我有一个类似的文件:

cat text.txt
a1       a2       j
h       a1
k       p       a1       a2      a3

我希望得到的列比所有匹配的字符串“a”。

a1    a2
a1
a1    a2    a3

我尝试使用awk,但只获得最后一个,而不是全部。

awk '{for(i=1;i<=NF;i++){if($i~/^a/){arr=$i}} print arr}' text.txt
a2
a1
a3

5 个答案:

答案 0 :(得分:2)

使用

<强>输入

$ cat file
a1       a2       j
h       a1
k       p       a1       a2      a3

<强>输出

$ awk '{s="";for(i=1;i<=NF;i++)if($i~/^a/)s=(s?s OFS:"") $i; if(s)print s}' file
a1 a2
a1
a1 a2 a3

<强>解释

awk '{                                        # call awk
        s="";                                 # set var s with null value, in fact it reset variable s for each line/record/row read by awk 
        for(i=1;i<=NF;i++)                    # NF gives no of fields in record, so loop through first to last field of current record/line/row
                if($i~/^a/)s=(s?s OFS:"") $i; # if current field($i) starts with a then, if variable s has something before then concatenate s with output separator and current field value, else set s with current field


        if(s)                                 # if s has something then  
            print s                           # print s
      }
     ' file

详细了解ternary operator

s = ( s ? s OFS : "" ) $i;

      ^
  Above one is same as below

# Or if(s != "") or if(length(s))
if(s)
{
    s = s OFS $i
}else
{
    s = $i
}

答案 1 :(得分:0)

我建议您从Python doc中阅读Reading and Writing Files并尝试。打开文件,并使用for循环将每行的内容作为字符串。

然后split字符串和filter列表以获取所需字段,如果需要字符串,请使用join

with open("tryme.txt") as f:
    for line in f:
        #split the string and filter it.

尝试编写自己的代码,如果您遇到困难,请问它.StackOverflow不是设计,编码或教程服务。

答案 2 :(得分:0)

@hope:请尝试关注:

awk '{gsub(/[^a[0-9]]*/," ");gsub(/^[[:space:]]+|[[:space:]]+$/,"");print}'   Input_file

说明:全局替换除了没有字符串的字段之外的所有内容。因为你还没有提到过是否有混合字段(可能还有其他内容)所以不考虑那部分,如果是混合值(字符串a和其他字符串),它只会打印一个&# 39; S。 然后将从空格开始并以空格结尾的空格替换为行中的NULL,然后打印该行。

答案 3 :(得分:0)

awk '{j=0;for(i=1;i<=NF;i++)if($i~/^a/){printf (++j<2?"":FS) $i};print""}' urfile

答案 4 :(得分:0)

get columns contain specific string的正确方法是:

$ awk '{
    c=0
    for (i=1;i<=NF;i++) {
        if ( index($i,"a") ) {
            printf "%s%s", (c++ ? OFS : ""), $i
        }
    }
    if (c) {
        print ""
    }
}' file
a1 a2
a1
a1 a2 a3

这适用于出现在任何字段任何位置的任何字符串“a”,当目标字符串包含正则表达式元字符时不会产生错误匹配,并且当不匹配时不会打印空行。