Regex 与第二个awk文件比较后无法替换文件
我试图比较两个文件,然后用第二个文件中匹配的内容替换第一个文件的内容 第一个文件:Regex 与第二个awk文件比较后无法替换文件,regex,awk,text-processing,Regex,Awk,Text Processing,我试图比较两个文件,然后用第二个文件中匹配的内容替换第一个文件的内容 第一个文件: 14523 : NOT 98765 : OTH 23145 : UNT 65743 : NOT 第二个文件: 23145vec#1 14523vec#2 65743vec#3 98765vec#4 输出应如下所示: 23145vec#1 : UNT 14523vec#2 : NOT 65743vec#3 : NOT 98765vec#4 : OTH 我想做的是: awk 'NR==FNR { F2[$1]
14523 : NOT
98765 : OTH
23145 : UNT
65743 : NOT
第二个文件:
23145vec#1
14523vec#2
65743vec#3
98765vec#4
输出应如下所示:
23145vec#1 : UNT
14523vec#2 : NOT
65743vec#3 : NOT
98765vec#4 : OTH
我想做的是:
awk 'NR==FNR { F2[$1] = $1 } ($1 in F2){print F2[$1] = $1" : "$2; next} ' file2 file1 > final.txt
结果是:
23145vec#1 :
14523vec#2 :
65743vec#3 :
98765vec#4 :
请您尝试以下,书面和测试显示的样本在GNU awk 说明:增加对以上内容的详细说明
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section of this program from here.
FS=OFS=" : " ##Setting field and output field separator as " : " for all lines.
}
FNR==NR{ ##Checking FNR==NR which will be TRUE when Input_file1 is being read.
a[$1]=$NF ##Creating array a with index $1 and value of last field here.
next ##next will skip all further statements from here.
}
match($0,/^[0-9]*/) && substr($0,RSTART,RLENGTH) in a{ ##Using match function of awk to match digits from starting till anything else comes and checking if that matched regex substring is present in array a then do following.
print $0,a[substr($0,RSTART,RLENGTH)] ##Printing current line and value of array a with matched regex sub string here.
}
' Input_file1 Input_file2 ##Mentioning Input_file names here.
第二种解决方案:如果输入文件2始终有5个与输入文件1匹配的初始字符,请尝试以下操作
awk '
BEGIN{
FS=OFS=" : "
}
FNR==NR{
a[$1]=$NF
next
}
substr($0,1,5) in a{
print $0,a[substr($0,1,5)]
}
' file1 file2
为什么OP的尝试不起作用:因为输入文件1和输入文件2的字段分隔符设置不正确,所以OP的尝试不起作用。IMHO设置2个不同的字段分隔符将是一个困难的过程,因此我建议使用上述2种解决方案,一旦我有时间,我也会尝试添加OP的尝试更正:请尝试使用GNU awk中显示的样本编写并测试以下内容 说明:增加对以上内容的详细说明
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section of this program from here.
FS=OFS=" : " ##Setting field and output field separator as " : " for all lines.
}
FNR==NR{ ##Checking FNR==NR which will be TRUE when Input_file1 is being read.
a[$1]=$NF ##Creating array a with index $1 and value of last field here.
next ##next will skip all further statements from here.
}
match($0,/^[0-9]*/) && substr($0,RSTART,RLENGTH) in a{ ##Using match function of awk to match digits from starting till anything else comes and checking if that matched regex substring is present in array a then do following.
print $0,a[substr($0,RSTART,RLENGTH)] ##Printing current line and value of array a with matched regex sub string here.
}
' Input_file1 Input_file2 ##Mentioning Input_file names here.
第二种解决方案:如果输入文件2始终有5个与输入文件1匹配的初始字符,请尝试以下操作
awk '
BEGIN{
FS=OFS=" : "
}
FNR==NR{
a[$1]=$NF
next
}
substr($0,1,5) in a{
print $0,a[substr($0,1,5)]
}
' file1 file2
为什么OP的尝试不起作用:因为输入文件1和输入文件2的字段分隔符设置不正确,所以OP的尝试不起作用。IMHO设置2个不同的字段分隔符将是一个困难的过程,因此我建议使用上述2种解决方案,一旦我有时间,将尝试添加OP的尝试更正:由于键是数字键,您可以通过向其添加零来截断非数字部分,即23145vec1+0=23145: 输出:
23145vec#1 : UNT
14523vec#2 : NOT
65743vec#3 : NOT
98765vec#4 : OTH
由于键是数字键,您可以通过向其添加零来截断非数字部分,即23145vec1+0=23145: 输出:
23145vec#1 : UNT
14523vec#2 : NOT
65743vec#3 : NOT
98765vec#4 : OTH
以下是另一种awk:
'
file2之前的FS='vec'仅为file2设置此字段分隔符。这里有一个替代awk:
'
file2之前的FS='vec'仅为file2设置此字段分隔符。要比较的键1452398765等。。它们总是五个字符吗?是的,键总是由五个字符组成。没有一个答案试图解释您最初的尝试不起作用的原因-当您在F2中使用$1时,这意味着元素$1与F2中的一个索引完全匹配,但您给定的输入并非如此。第二个文件中的行仅包含第一个文件中的部分行。因此,您需要应用一些正则表达式匹配条件来匹配要比较的元素1452398765等。。它们总是五个字符吗?是的,键总是由五个字符组成。没有一个答案试图解释您最初的尝试不起作用的原因-当您在F2中使用$1时,这意味着元素$1与F2中的一个索引完全匹配,但您给定的输入并非如此。第二个文件中的行仅包含第一个文件中的部分行。因此,您需要应用一些正则表达式匹配条件来匹配元素,这比我要建议的substr$0,1,5解决方案要好,这比我要建议的substr$0,1,5解决方案要好
23145vec#1 : UNT
14523vec#2 : NOT
65743vec#3 : NOT
98765vec#4 : OTH