我正在运行一个 bash 脚本,我输入一个文件,它读取该文件并循环运行该文件。我的问题是我的 awk 命令。我不知道为什么我会收到错误
我输入一个运行脚本的文件
./almost.sh < text.txt
脚本是
#!/bin/bash
while read STRING
do
echo $STRING
"awk -v RS='' -v ORS='\n\n' $STRING file.txt" >> out.txt
#grep $STRING dbutils.list.Volume.txt >> out.txt
done
我得到的输出是
00061
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 00061 list.txt: command not found
00062
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 00062 list.txt: command not found
00091
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 00091 list.txt: command not found
000C1
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 000C1 list.txt: command not found
000C2
./almost.sh: line 6: awk -v RS='' -v ORS='\n\n' 000C2 list.txt: command not found
有人可以帮忙使用 awk 命令吗?如果该命令不在循环中而仅运行一次,则该命令可以正常工作。
答案1
报错是因为没有命令
"awk -v RS='' -v ORS='\n\n' $STRING file.txt"
awk 及其参数(没有意义)位于双引号之间,对于 shell,该组合是命令,shell 正在查找名为“awk -v RS='' -v ORS='\n\n' 的文件$STRING 文件.txt”。
也许你的意思是
awk -v RS='' -v ORS='\n\n' "/$STRING/" file.txt >> out.txt
答案2
由于还没有进一步的回复,我建议整个脚本可以简单地替换为
grep -F -f text.txt file.txt >out.txt
这是假设 text.txt 的输入只是要检查的字符串而不是正则表达式,由错误消息建议将 $STRING 替换为 000.. 因此, -f 从文件中读取每个字符串,而 -F 只是处理它们作为普通字符串。任何与 file.txt 匹配的内容都将被发送到 out.txt。
作为对下面 dave_thompson_085 的评论的回应,如果存在具有已知结构的段落,这可能仍然有用,即查找的字符串位于每个段落中的特定行,然后-B
和-A
选项也可用于打印之前的行数以及赛后。