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