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

时间:2014-03-14 07:09:05

标签: 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 otherstuff

我需要做的是以某种方式将第一个文件分成2个,取决于第二个文件的值,因此结果将类似于:

fileWithValuesA:

name1 stuff stuff
name4 stuff stuff

fileWithValuesB:

name2 stuff stuff
name3 stuff stuff

第二个文件包含的信息比第一个文件多,所以我不能同时检查2个文件中的行,因为它们不会是同一个名字(这是我想到的唯一的想法:()

3 个答案:

答案 0 :(得分:1)

对于那些足够专业的东西,我会突破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()

答案 1 :(得分:1)

我认为valueAvalueB是动态值,所以它们不应该直接成为关键词。

这是放入一个awk的解决方案。如果有超过2个值键,它很容易生成许多不同的值文件。

awk 'NR==FNR{a[$1]=$0;next}{print a[$1]> "fileWith" $3}' file1 RS="" file2

运行awk命令后,您将获得多个文件,所有文件都由值[AB ...]命名。

$ cat fileWithvalueA
name1 stuff stuff
name4 stuff stuff

$ cat fileWithvalueB
name2 stuff stuff
name3 stuff stuff

答案 2 :(得分:0)

假设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