grep -f r t,如何使结果按r排序,而不是t

时间:2014-05-06 08:45:47

标签: linux shell sorting grep

$ cat r
1
2
$ cat t
22
11
$ grep -f r t
22
11

根据t中的顺序提供结果,如何按r排序结果?

1 个答案:

答案 0 :(得分:2)

您可以创建一个脚本,将所有内容保存在内存中,或者您可以应用Schwartzian transform。以下是对后者的简要尝试。

r文件更改为sed脚本,为每场比赛打印一个索引编号:

/1/s/^/00001 /
/2/s/^/00002 /

使用sed代替grep,并按前缀排序;然后丢弃前缀。

sed -f r t | sort -n | cut -d ' ' -f2- >output

创建sed脚本不应该太难;这是一个简单的Awk脚本(哦,具有讽刺意味!)

awk '{ printf("/%s/s/^/%05i /\n", $0, NR) }' r >r.sed

如果你的正则表达式中有斜杠,事情就会变得稍微复杂一些。请记住,/foo/也可以写成\:foo:,因此,如果您能找到数据中没有出现的合适分隔符,那么这可能是最简单的解决方法。

如果您的sed可以从标准输入中读取脚本(并非所有脚本都可以,但Linux sed应该没问题),您可以避免使用临时文件;那么整个管道就是

awk '{ printf("/%s/s/^/%05i /\n", $0, NR) }' r |
sed -f - t | sort -n | cut -d ' ' -f2- >output