我正在谷歌上搜索,但我完全不知道该怎么做:
我有两个不同的文件:
首先是格式:
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个文件中的行,因为它们不会是同一个名字(这是我想到的唯一的想法:()
答案 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)
我认为valueA
或valueB
是动态值,所以它们不应该直接成为关键词。
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