$ cat r
1
2
$ cat t
22
11
$ grep -f r t
22
11
根据t
中的顺序提供结果,如何按r
排序结果?
答案 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