我有一个包含以下内容的文件,我只想打印第一个单词,如果它是以P
开头,并且最后5个字符是12
文件:
papa;1;2;3;4;5;12;12;12;12;12
Peter;12;12;12;12;12
alpha;2;2;2;4;5;6;7;8;9;3;3;3;3;3
Prod;1;2;3;4;1;1;1;1;12;12;12;12;12
预期产出:
Peter
Prod
我的尝试:
cat filename | awk -F '[;]' '{print substr( $0,length($0)-5,length($0))}'
cat filename | egrep -V 'p|a' | awk -F '[;]' '{print $1}'
但我无法加入输出。
更新: -
根据接受的答案中的评论,显然OP表示最终文件中的行数可能少于5个字段。
答案 0 :(得分:4)
在Awk
中单独使用第一个单词的粗略方法
awk -F';' '$1 ~ /^P/ && NF > 5 {c=0; for(i=NF-4;i<=NF;i++) {if($i==12){c++}} if(c==5) print $1} ' file
Peter
Prod
如果需要整行,请在$1
声明中删除print
awk -F';' '$1 ~ /^P/ && NF > 5 {c=0; for(i=NF-4;i<=NF;i++) {if($i==12){c++}} if(c==5) print} ' file
Peter;12;12;12;12;12
Prod;1;2;3;4;1;1;1;1;12;12;12;12;12
它如何运作?
$1 ~ "^P"
是一个正则表达式匹配,用于过滤掉以P
开头的行NF
循环并维护计数器,如果找到5个12
个实例,则打印该行。答案 1 :(得分:4)
这是另一个awk
$ cat ip.txt
papa;1;2;3;4;5;12;12;12;12;12
Peter;12;12;12;12;12
alpha;2;2;2;4;5;6;7;8;9;3;3;3;3;3
Prod;1;2;3;4;1;1;1;1;12;12;12;12;12
Post;1;3;12;12;12
$ awk -F';' '/^P.*(;12){5}$/{print $1}' ip.txt
Peter
Prod
/^P.*(;12){5}$/
行以P
开头;12;12;12;12;12
答案 2 :(得分:0)
另一种递归检查方法,其中包含变量中的所有内容。如果这有助于你,请告诉我。
awk -F";" -v num=12 -v count=5 -v cha="P" 'function check(count){if($(NF-(--count))==num && count){check(count)};if(!count && substr($0,1,1)==cha){print $1}} check(count)' Input_file
将很快添加非单一的衬垫形式和上述代码的说明。
EDIT1: 现在也成功添加非单线形式的解决方案。
awk -F";" -v num=12 -v count=5 -v cha="P" '
function check(count){
if($(NF-(--count))==num && count){
check(count)
};
if(!count && substr($0,1,1)==cha){
print $1
}
}
check(count)
' Input_file