我有两个文件。
文件1包括各种类型的系列描述
"SeriesDescription": "Type_*"
"SeriesDescription": "OtherType_*"
...
文件2包含只有一个系列的信息描述
"Name":"Joe"
"Age":"18"
"SeriesDescription":"Type_(Joe_text)"
...
我想
- 比较这两个文件并找到与";序列描述";以及
- 打印文件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