如何从源文件和参考文件中提取行,添加到结果文件中?

如何从源文件和参考文件中提取行,添加到结果文件中?

我有一个问题,无法弄清楚。它是索拉里斯。过于简化的源文件和参考文件。

s.txt源文件:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user10,cn=users,dc=domain

r.txt参考文件:

uniquemember: cn=user9,cn=users,dc=domain 
uniquemember: cn=user8,cn=users,dc=domain

我想要一个使用参考记录 uniquemember 文件来提取源文件的 cn=user9 行和上面 3 行的脚本,添加到结果文件 usermember_

添加.ldif:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

答案1

如果您尝试使用r.txtas中的值从 中提取匹配的多行记录s.txt,然后尝试

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= s.txt
  • r.txt使用默认(换行)记录分隔符进行处理,u使用第二个空格分隔字段中的键构造关联数组;然后
  • 取消设置记录分隔符RS=以切换到段落模式对于第二个文件
  • 以段落模式处理s.txt,即将每个空行分隔的块视为单个记录,$NF然后可以将其最后一个字段值用作查找值u
  • 如果$NF存在于u,则打印整个记录

要在匹配的记录之间添加空格:

如果您有 GNU awk ( gawk),您可以使用特殊变量RT来添加回原始段落分隔符:

gawk 'NR==FNR {u[$2]++; next} $NF in u {print $0 RT}' r.txt RS= s.txt

更一般地,您可以在每个匹配的记录之后附加一个额外的换行符:

awk 'NR==FNR {u[$2]++; next} $NF in u {print $0 "\n"}' r.txt RS= s.txt

或在默认值中添加额外的换行符输出字段分隔符:

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= ORS='\n\n' s.txt

答案2

从您的问题中我了解到您想使用代码读取user中的关键字r.txt,然后在 中搜索该关键字s.txt。最后,打印与该关键字相关的行(以及前三行)in s.txt。您可以将这些行写入名为的文件中"code"

#!/bin/bash
if  [[ `egrep user9 r.txt` ]] ; then 
grep -B 3 user9 s.txt
fi

授予此文件"code"权限,然后在终端中运行它,如下所示:

code > add.ldif

输出是:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

假设您有两个user9in条目s.txt,如下所示:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user18,cn=users,dc=domain

dn: cn=XXX,cn=XXX,dc=XXX 
changetype: XXX 
add: XXX 
uniquemember: cn=user9,cn=users,dc=domain

前面的代码将找到 user9 的两个条目:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain
--
dn: cn=XXX,cn=XXX,dc=XXX 
changetype: XXX 
add: XXX 
uniquemember: cn=user9,cn=users,dc=domain

相关内容