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