为什么用数字线修改p?

时间:2017-04-10 11:08:54

标签: awk

看看以下代码。我的意图是仅用字母行设置变量p

awk '/^[A-Z]/{p="$0"; print "set p: " $p}
{print "p: " $p}' <<EOF
A
1
2
3
B
4
5
6
EOF

程序在我的系统上生成以下输出:

set p: A
p: A
p: 1
p: 2
p: 3
set p: B
p: B
p: 4
p: 5
p: 6

虽然p仅设置为字母行,但每行的值都会更改。为什么呢?

3 个答案:

答案 0 :(得分:3)

$p表示其编号包含在变量p中的字段。因此,如果p为4,则$p指的是第四个字段。我怀疑你是在混淆awk语法与Perl或shell语法。

(在我的MacOS上,我为你的例子得到awk: illegal field $($0), name "p",但这显然取决于实现。)

另请注意,此尝试修复中$0周围没有引号:

sierra$ awk '/^[A-Z]/{p=$0; print "set p: " p}
{print "p: " p}' <<<$'A\n1\n2\n3\nB\n4\n5\n6'
set p: A
p: A
p: A
p: A
p: A
set p: B
p: B
p: B
p: B
p: B

答案 1 :(得分:0)

@try:

awk '$0 ~ /[[:alpha:]]/ && val2{print "set p: " val1 ORS val2;val2="";} $0 ~ /[[:alpha:]]/{val1=$0;next} {val2=val2?val2 ORS $0:$0} END{print "set p: " val1 ORS val2}'  Input_file

因此检查行是否有字母和变量val2然后打印val1和val2的值(val1将具有alphabates值,val2将具有除字母之外的所有其他值)。现在检查一行是否在其中包含字母表然后将val1设置为当前行并使用next来跳过所有下一个语句。然后,如果不满足这个条件,则创建名为val2的变量,其值将与其自身连接,在结束部分块中打印val1和val2的值。

编辑:现在也添加非单行形式的解决方案。

awk '$0 ~ /[[:alpha:]]/ && val2{
                                print "set p: " val1 ORS val2;
                                val2="";
                               }
     $0 ~ /[[:alpha:]]/{
                        val1=$0;
                        next
                       }
                       {
                        val2=val2?val2 ORS $0:$0
                       }
     END{
                print "set p: " val1 ORS val2
        }
    '  Input_file

答案 2 :(得分:0)

试试这个 -

$ cat f
A
1
2
3
B
4
5
6
$ awk '{for(i=1;i<=NF;i++) if($i ~ /[[:alpha:]]/) {k=$i;print "set p: "k} {print "p: " k}}' f
set p: A
p: A
p: A
p: A
p: A
set p: B
p: B
p: B
p: B
p: B