如何在自包含的awk脚本中使用awk范围模式'/begin regex/,/end regex/'
?
澄清一下,给定程序csv.awk:
#!/usr/bin/awk -f
BEGIN {
FS = "\""
}
/TREE/,/^$/
{
line="";
for (i=1; i<=NF; i++) {
if (i != 2) line=line $i;
}
split(line, v, ",");
if (v[5] ~ "FOAM") {
print NR, v[5];
}
}
和文件块:
TREE
10362900,A,INSTL - SEAL,Revise
,10362901,A,ASSY / DETAIL - PANEL,Revise
,,-203,ASSY - PANEL,Qty -,Add
,,,-309,PANEL,Qty 1,Add
,,,,"FABRICATE FROM TEKLAM NE1G1-02-250 PER TPS-CN-500, TYPE A"
,,,-311,PANEL,Qty 1,Add
,,,,"FABRICATE FROM TEKLAM NE1G1-02-750 PER TPS-CN-500, TYPE A"
,,,-313,FOAM SEAL,1.00 X 20.21 X .50 THK,Qty 1,Add
,,,,"BMS1-68, GRADE B, FORM II, COLOR BAC706 (BLACK)"
,,,-315,FOAM SEAL,1.50 X 8.00 X .25 THK,Qty 1,Add
,,,,"BMS1-68, GRADE B, FORM II, COLOR BAC706 (BLACK)"
,PN HERE,Dual Lock,Add
,
10442900,IR,INSTL - SEAL,Update (not released)
,10362901,A,ASSY / DETAIL - PANEL,Revise
,PN HERE,Dual Lock,Add
我想要输出:
27 FOAM SEAL
29 FOAM SEAL
将命令行格式'/begin regex/,/end regex/'
添加到脚本以仅对这些行进行操作的语法是什么?我所有的尝试都会导致语法错误,谷歌搜索只会给我一个cli形式。
答案 0 :(得分:4)
为什么不使用两个步骤:
% awk '/start/,/end/' < input.csv | awk csv.awk
答案 1 :(得分:1)
简单地说:
#!/usr/bin/awk -f
BEGIN {
FS = "\""
}
/from/,/to/ {
line="";
for (i=1; i<=NF; i++) {
if (i != 2) line=line $i;
}
split(line, v, ",");
if (v[5] ~ "FOAM") {
print NR, v[5];
}
}
如果from
to
正则表达式是动态的:
#!/usr/bin/awk -f
BEGIN {
FS = "\""
FROM=ARGV[1]
TO=ARGV[2]
if (ARGC == 4) { # the pattern was the only thing, so force read from standard input
ARGV[1] = "-"
} else {
ARGV[1] = ARGV[3]
}
}
{ if ($0 ~ FROM) { p = 1 ; l = 0} }
{ if ($0 ~ TO) { p = 0 ; l = 1} }
{
if (p == 1 || l == 1) {
line="";
for (i=1; i<=NF; i++) {
if (i != 2) line=line $i;
}
split(line, v, ",");
if (v[5] ~ "FOAM") {
print NR, v[5];
}
l = 0 }
}
现在您必须将其称为:./scriptname.awk "FROM_REGEX" "TO_REGEX" INPUTFILE
。如果可以使用STDIN
,则最后一个参数是可选的。
HTH
答案 2 :(得分:0)
您需要向我们展示您尝试过的内容。有什么关于/开始正则表达式/或/结束正则表达式/你没有告诉我们,其他明智的你添加的脚本应该有用,即
#!/usr/bin/awk -f
BEGIN {
FS = "\""
}
/begin regex/,/end regex/{
line="";
for (i=1; i<=NF; i++) {
if (i != 2) line=line $i;
}
split(line, v, ",");
if (v[5] ~ "FOAM") {
print NR, v[5];
}
}
或者您使用的是旧的Unix,其中旧的awk为/ usr / bin / awk,New awk为/ usr / bin / nawk。另外看看你是否有/ usr / xpg4 / bin / awk或gawk(路径可以是任何东西)。
最后,向我们展示您收到的错误消息。
我希望这会有所帮助。