我做了一个小脚本试图搜索文件,查找所有特定字符串的出现,如下所示:a0002 b0590 c0964
脚本是这样的:
#!/bin/sh
#include <stdio.h>
#
while read id;
do
awk {'print $1'} test.trans | grep -e "$id"
done < test.id
为简化起见,我制作了一个我正在搜索的文件(test.trans)的精简版本:
"a0001" "a0002" "b0586" "b0587" "b0588" "b0589" "b0590" "b0591" "b0852" "b0952" "a0002" "b0587" "c0952" "c0964" "c1783" "c1786" "c1787"
我已将所有相关搜索字符串存储在名为test.id的单独文件中,如下所示:
a0002 b0587 b0588 b0589 b0590 b0591 b0852 b0952 c0952 c0964 c1781
这个想法是将test.id文件中的每个搜索字符串作为变量传递,然后由grep用来过滤掉test.trans文件中的所有匹配项 但是,当我运行脚本时,grep只匹配一些字符串。当我更改test.id文件中搜索模式的顺序时,结果也会更改。我究竟做错了什么? 我认为自己是shell编程的新手,非常感谢任何帮助。
答案 0 :(得分:1)
我不知道你问题的原因。 但是这里有一些不适合评论的评论。
cat test.trans
代替awk {'print $1'} test.trans
。如果您使用awk
,则不需要grep。你可以通过调用awk /"$id"'/ {print $1}' test.trans
来实现这个问题,grep可以过滤多个模式。而不是你的for循环
grep -f test.id test.trans
答案 1 :(得分:0)
经过一些实验,我发现所有这一切都归结为从test.id文件中的每一行中删除回车符(\ r \ n)。这个文件是从DOS机器收到的,我的iMac使用的UNIX格式只包含换行符(\ n)