Bash 将值从一个文件匹配到另一个文件

Bash 将值从一个文件匹配到另一个文件,bash,file,sed,awk,match,Bash,File,Sed,Awk,Match,我在谷歌上搜索了很多次,但我完全不知道该怎么做: 我有两个不同的文件: 第一种格式: name1 stuff stuff name2 stuff stuff name3 stuff stuff name4 stuff stuff name1 otherstuff valueA otherstuff name2 otherstuff valueB otherstuff name3 otherstuff valueB otherstuff name4 otherstuff valueA ot

我在谷歌上搜索了很多次,但我完全不知道该怎么做:

我有两个不同的文件:

第一种格式:

name1 stuff stuff
name2 stuff stuff
name3 stuff stuff
name4 stuff stuff
name1 otherstuff
valueA otherstuff

name2 otherstuff
valueB otherstuff

name3 otherstuff
valueB otherstuff

name4 otherstuff
valueA otherstuff
第二种格式:

name1 stuff stuff
name2 stuff stuff
name3 stuff stuff
name4 stuff stuff
name1 otherstuff
valueA otherstuff

name2 otherstuff
valueB otherstuff

name3 otherstuff
valueB otherstuff

name4 otherstuff
valueA otherstuff
我需要做的是,根据第二个文件的值,以某种方式将第一个文件拆分为2,因此结果如下:

具有值的文件a:

name1 stuff stuff
name4 stuff stuff
具有值的文件b:

name2 stuff stuff
name3 stuff stuff

第二个文件包含的信息比第一个文件多,因此我无法同时检查两个文件中的行,因为它们的名称不同(这是我唯一想到的:()

假设file2结构与您在整个文件中提到的完全相同:

$ awk 'BEGIN{a=""} (NF){if (a=="")a=$1; else {print a " " $1; a=""}}' file2 > file_temp

$ grep -f <(awk '/valueA$/{print $1}' file_temp) file1 > fileWithValuesA; cat fileWithValuesA
name1 stuff stuff
name4 stuff stuff

$ grep -f <(awk '/valueB$/{print $1}' file_temp) file1 > fileWithValuesB; cat fileWithValuesB
name2 stuff stuff
name3 stuff stuff
$awk'BEGIN{a=”“}(NF){if(a==“”)a=$1;else{print a”“$1;a=“”}}file2>文件
$grep-f带值文件a;cat带值文件a
说出一件事
说出4件事
$grep-f带值文件b;cat带值文件b
说出2个东西
说出3件事

对于一些足够专业化的东西,我只想介绍一下
Python
,因为它对于类似的任务更具可读性和可维护性

在下面的代码中,我假设
FileA
是您的第一个文件,
FileB
是您的第二个文件。 将它们变成命令行选项并不难

refFile = open('FileB')
fileToSplit = open('FileA')

# Read the reference file and remove blank lines
temp = refFile.read().split("\n")
temp = [x for x in temp if x != ""]

# Build a map based on refFile
mymap = {}
for i in xrange(0, len(temp), 2):
   mymap[temp[i].split()[0]] = temp[i+1].split()[0]

# Open two output files and  make a pass through fileToSplit
OutValA = open("fileWithValuesA","w")
OutValB = open("fileWithValuesB","w")

for line in fileToSplit:
  if mymap[line.split()[0]] == "valueA":
    OutValA.write(line)
  else:
    OutValB.write(line)

OutValA.close()
OutValB.close()
refFile.close()
fileToSplit.close()

我猜
valueA
valueB
是动态值,因此它们不应该直接成为关键词

这是一个awk的解决方案。如果有两个以上的值键,它很容易生成许多不同的值文件。 运行awk命令后,您将获得多个文件,所有文件都以值[AB..]命名

$ cat fileWithvalueA
name1 stuff stuff
name4 stuff stuff

$ cat fileWithvalueB
name2 stuff stuff
name3 stuff stuff

+1…我正要提供另一个基于
awk
的解决方案,但意识到它将遵循与此几乎相同的算法。唯一的优点是,文件名不需要硬编码。我看不到任何分割标准,因此基于此,第二个文件是无用的。它是模式匹配、特定预定义值吗(如何认识他们)?