我有一个类似的文件:
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
答案 0 :(得分:2)
使用awk
<强>输入强>
$ 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”,当目标字符串包含正则表达式元字符时不会产生错误匹配,并且当不匹配时不会打印空行。