使用awk和regexp匹配两个文件中的字符串



我有两个文件。

文件1包括各种类型的系列描述

"SeriesDescription": "Type_*"
"SeriesDescription": "OtherType_*"
...

文件2包含只有一个系列的信息描述

"Name":"Joe"
"Age":"18"
"SeriesDescription":"Type_(Joe_text)"
...

我想

  1. 比较这两个文件并找到与";序列描述";以及
  2. 打印文件1中匹配文本的行号

预期输出:

"SeriesDescription": "Type_*" 24 11(我的文件中正确的行号(

"序列描述";将始终在文件2的第11行找到。我在匹配给定的*时遇到了问题,也曾尝试将其更改为.*,但没有成功。

我尝试过的代码:

grep -nf File1.txt File2.txt

成功匹配,但我想要File1 中的行号

awk 'FNR==NR{l[$1]=NR; next}; $1 in l{print $0, l[$1], FNR}' File2.txt File1.txt

这会找到匹配项并打印两个文件中的行号,但是,这在第一列上是匹配的,并打印文件1中的最后一行作为匹配项(因为文件1的每一行都有相同的列1(。

awk 'FNR==NR{l[$2]=$3;l[$2]=NR; next}; $2 in l{print $0, l[$2], FNR}' File2.txt File1.txt

不匹配。

我也尝试过FS=":"的各种设置,但运气不好。我不确定问题是来自正则表达式还是使用"在文件或其他什么文件中。如有任何帮助,我们将不胜感激!

使用您显示的示例,请尝试以下操作。在GNUawk中编写和测试,应该在任何awk中工作。

awk '
{ val="" }
match($0,/^[^_]*_/){
val=substr($0,RSTART,RLENGTH)
gsub(/[[:space:]]+/,"",val)
}
FNR==NR{
if(val){
arr[val]=$0 OFS FNR
}
next
}
(val in arr){
print arr[val] OFS FNR
}
' SeriesDescriptions file2

与您显示的样本输出将是:

"SeriesDescription": "Type_*" 1 3

解释:添加了对上述内容的详细解释。

awk '                            ##Starting awk program from here.
{ val="" }                       ##Nullifying val here.
match($0,/^[^_]*_/){             ##Using match to match value till 1st occurrence of _ here.
val=substr($0,RSTART,RLENGTH)  ##Creating val which has sub string of above matched regex.
gsub(/[[:space:]]+/,"",val)    ##Globally substituting spaces with NULL in val here.
}
FNR==NR{                         ##This will execute when first file is being read.
if(val){                       ##If val is NOT NULL.
arr[val]=$0 OFS FNR          ##Create arr with index of val, which has value of current line OFS and FNR in it.
}                       
next                           ##next will skip all further statements from here.
}
(val in arr){                    ##Checking if val is present in arr then do following.
print arr[val] OFS FNR         ##Printing arr value with OFS, FNR value.
}
' SeriesDescriptions file2       ##Mentioning Input_file name here.

奖励解决方案:如果以上对您来说很好,并且您的文件2中只有一次匹配,那么您可以从程序中exit以使其快速,在这种情况下,以以下方式使用上述代码。

awk '
{ val="" }
match($0,/^[^_]*_/){
val=substr($0,RSTART,RLENGTH)
gsub(/[[:space:]]+/,"",val)
}
FNR==NR{
if(val){
arr[val]=$0 OFS FNR
}
next
}
(val in arr){
print arr[val] OFS FNR
exit
}
' SeriesDescriptions file2

最新更新