看看以下代码。我的意图是仅用字母行设置变量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
仅设置为字母行,但每行的值都会更改。为什么呢?
答案 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