Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk:如何传递和使用数组值_Bash_Shell_Awk_Scripting - Fatal编程技术网

Bash awk:如何传递和使用数组值

Bash awk:如何传递和使用数组值,bash,shell,awk,scripting,Bash,Shell,Awk,Scripting,我有一个awk脚本,它将从input1.txt中读取搜索关键字,如果搜索字符串 存在于input2.xml中 $ cat myAwk.awk NR==FNR { keywordArray[NR]=$0; next; } /<record / { i=1 } i { a[i++]=$0 } /<\/record>/ { if (found) { for (i=1; i<=length(a); ++i) print a[i] >> res

我有一个
awk
脚本,它将从
input1.txt
中读取搜索关键字,如果搜索字符串 存在于
input2.xml中

$ cat myAwk.awk
NR==FNR {
keywordArray[NR]=$0;
next;
}

/<record / { i=1 }
i { a[i++]=$0 }
/<\/record>/ {
    if (found) {
        for (i=1; i<=length(a); ++i) print a[i] >> result.txt
    }
    i=0;
    found=0
}
/<keyword>KEYWORD1<\/keyword>/ { found=1 }
/<keyword>KEYWORD2<\/keyword>/ { found=1 }
.....
$cat myAwk.awk
NR==FNR{
关键词数组[NR]=0美元;
下一个
}
/result.txt
}
i=0;
找到=0
}
/关键字1/{found=1}
/关键字2/{found=1}
.....
这就是我需要帮助的地方。我需要传递存储在keywordArray中的关键字值

$ cat input1.txt
KEYWORD1
KEYWORD2
KEYWORD3
...

$ cat input2.xml
<record category="xyz">
<person ssn="" e-i="E">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<names>
<first_name/>
<last_name></last_name>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>KEYWORD1</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>KEYWORD1 is present in abc for xyz reason</detail>
</external_sources>
</details>
</record>

<record category="abc">
<person ssn="" e-i="F">
<title xsi:nil="true"/>
<position xsi:nil="true"/>
<names>
<first_name/>
<last_name></last_name>
<aliases>
<alias>CDP</alias>
</aliases>
<keywords>
<keyword xsi:nil="true"/>
<keyword>DONTSEARCH</keyword>
</keywords>
<external_sources>
<uri>http://www.google.com</uri>
<detail>SEARCH is not present in abc for xyz reason</detail>
</external_sources>
</details>
</record>

$ awk -f myAwk.awk input1.txt input2.xml
$cat input1.txt
关键词1
关键词2
关键词3
...
$cat input2.xml
CDP
关键词1
http://www.google.com
由于xyz原因,关键字1出现在abc中
CDP
DONTSEARCH
http://www.google.com
由于xyz原因,abc中不存在搜索
$awk-f myAwk.awk input1.txt input2.xml

我要么将input1.txt重写为一个bash文件,设置关键字数组。 通过这种方式,您可以使用source调用脚本,数组将在调用脚本中设置

否则,您可以像这样循环输入:

input=$(cat $0)
delimiter="\n" #I don't know that this works, otherwise you'll have to replace the newlines with something else
i=0
j=0
while [ ${#input} -gt 0 ]
do
    if [ ${input:$j:1} == delimiter ]
    then
        keywordArray[i]=${input:0:$((j-1))}
        input=${input:$((j+1))}
        j = 0
        ((++i))
    else
        ((++j))
    fi
done

您可以使用此
awk

awk 'NR==FNR{keywords[$0]++;next} /^<record/{p=1;data=""} p{data = data RS $0;} /^<\/record/{for(key in keywords){if(data ~ key){print data}}}' input1.txt input2.xml
awk 'NR==FNR{keywords[$0]++;next}
     /^<record/{p=1;data=""} 
     p{data = data RS $0;} 
     /^<\/record/{for(key in keywords){if(data ~ key){print data}}}' input1.txt input2.xml

我需要传递存储在keywordArray中的关键字值。
-不,您不需要,您只需要首先不使用数组来存储它。只要把我给你的答案改成:

$ awk  '
      NR==FNR{keys=keys sep $0; sep="|"; next}
      {ORS=RT} $0~"<keyword>("keys")</keyword>"
  ' input1.txt RS='</record>\n' input2.xml
$awk'
NR==FNR{keys=keys sep$0;sep=“|”;next}
{ORS=RT}$0~“(“键”)”
'input1.txt RS='\n'input2.xml

以上内容未经测试,因为您第一次没有接受答案,所以这次我不想花费太多精力修改它。不过,它应该很接近,希望您能理解。

您的预期输出是什么?预期输出是从
的整个记录内容。
应该写入
result.txt
。只有那些
标记值与
关键字匹配的记录
如果这些是shell分配,则
=
符号周围不能有空格。如果是
awk
作业,
while
不使用
do
done
。您还需要在
while
if
语句中的条件下工作,无论它是shell还是
awk
——但所需的工作取决于它是shell还是
awk
。一般来说,我同意你的第一段:使用
awk
sed
或其他方法将关键字列表转换为所需的
awk
脚本,然后运行结果。感谢你让我知道,我已经很久没有在bash中编程了。更好,但是在大多数机器上没有命令
++i
++j
。在Bash中,您可能已经想到了
(++i))
(++j))
。POSIX将使用
$(…)
,我保留是否可以使用增量的判断。另外,
cat$0
可能会将脚本列在
input
中,假设Bash为脚本提供了一个有效的路径名,名为
$0
@S.Klumpers
keywordArray[i]=${input:0:$((j-1))
看起来像是给
keywordArray
赋值。但是,在从XML文件的内容进行搜索时,这个
关键字数组在哪里使用?我不知道,我以为您在将input1.txt转换为数组时遇到了问题。例如,要搜索input2.xml,您可以在数组中循环,并在每个关键字的inpu2.xml中循环。我有
KEYWORD1
KEYWORD2
KEYWORD3
(3个关键字)。这与2
内容匹配。因此,输出为3*2=6条记录内容。搜索逻辑似乎是错误的。而且,我没有得到
RS
。似乎它没有分配任何值。我不得不接受另一个答案,因为它接近我所期望的答案。顺便说一句,是我把你的答案投给了你在这里链接的答案。没问题,我只是不想在一个不是你想要的答案上花费太多精力。