0

这是我写的脚本

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 | xargs

xargs使用之前,我的 o/p 是

01982893213982312 - RID 1
32103213213213213 - RID 2
32103213213213343 - RID 3
32103213213251261 - RID 4

对于此处存在的每个 RID,文件 B 中都有相应的行。我计划在以下内容之后执行以下操作:

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 | xargs|
{grep RID1 in file B, grep RID2 in file B,grep RID3 in file B, grep RID4 in file B}

现在我唯一的问题是我将如何使用 xargs 引用 RID1,2,3,4....

4

2 回答 2

0

如果 FileA 中的数据是每行一个 RID,那么显而易见的选择是(经典)fgrep或(使用更现代的表示法)grep -F。2004 版本中的POSIX 未标准化fgrep(将其替换为grep -F)。然而,fgrep有着很长的血统;例如,它是 1978 年左右的第 7 版 UNIX™ 的一部分。

fgrep -f FileA FileB
grep -F -f FileA FileB

如果 FileA 中的数据不是“每行一个 RID”格式,那就这样吧!


但是 fgrep 是否从控制台读取 i/p

如果您告诉它,它会这样做,但您不希望它从控制台读取;您希望它从标准输入中读取。“控制台输入”大致意思是“你在打字”。(也就是说,我grep -F通过使用grep -F -f - /etc/passwd然后/bin/在“控制台”(终端)上键入来检查行为,然后指示 EOF。它工作正常。)

如果您正在使用bash,您可以使用“进程替换”来获得您想要的结果:

grep -F -f <(zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2) FileB

进程替换在内部运行命令,<( ... )以便其输出到“文件”(实际上,通常是 中的文件描述符),并将名称作为常规文件名参数/dev/fd提供给命令 ( )。grep

如果您不使用bash,则可以改用它(这也可以正常工作bash,甚至可能更可取):

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 |
grep -F -f - FileB

在这种情况下,单独的破折号表示“从标准输入读取”;这是命令的通用约定。它在 Mac OS X 10.7.4 上运行良好;它很有可能在其他地方也可以使用。

于 2012-06-20T02:13:11.717 回答
0

另一种方法是管道数据,例如:

script1 fileA | script2 fileB

这种方法允许您传递更多参数,并通过 fileB..

于 2012-06-20T02:05:12.913 回答