Regex AWK显示直到第一个差异

Regex AWK显示直到第一个差异,regex,bash,awk,grep,Regex,Bash,Awk,Grep,我希望AWK显示所有内容,直到两个文件中根据我的条件出现第一个差异 File1行:C0004CF5C5JMP$C5F5A:00X:00Y:00P:24SP:FD CYC:0SL:241 文件2行:JMP$C5F5 0x0000c000 A:00 X:00 Y:00 | SP:fd p:24 N0 V0 B0 D0 I1 Z0 C0 这两行在结构上不同,但这没有问题,因为我可以使用正则表达式: awk'match($0,/p\:\([0-9]+)/){print substr($0,RSTART,

我希望AWK显示所有内容,直到两个文件中根据我的条件出现第一个差异

File1行:
C0004CF5C5JMP$C5F5A:00X:00Y:00P:24SP:FD CYC:0SL:241

文件2行:
JMP$C5F5 0x0000c000 A:00 X:00 Y:00 | SP:fd p:24 N0 V0 B0 D0 I1 Z0 C0

这两行在结构上不同,但这没有问题,因为我可以使用正则表达式:

awk'match($0,/p\:\([0-9]+)/){print substr($0,RSTART,RLENGTH)}File1.txt

这会打印出
p:24
值,不管它出现在
File1
的哪个列中

我想要什么

  • 比较每一行的
    P:number
  • 一旦P值不同,停止输出
编辑:输出的外观

文件1

A:1 B:2 P:3
A:1 B:2 P:4
A:1 B:2 P:5
A:1 P:3 C:3
A:1 P:4 C:4
A:1 P:55 C:5
文件2

A:1 B:2 P:3
A:1 B:2 P:4
A:1 B:2 P:5
A:1 P:3 C:3
A:1 P:4 C:4
A:1 P:55 C:5
输出:

A:1 P:3 C:3
A:1 P:4 C:4
因为第三行不同。我不在乎输出哪个文件,第一个还是第二个,直到第一个条件不同:)

如果您有GNU awk,则可以使用单词边界使match()更精确:

match($0,/\<P:[0-9]+\>/)
匹配($0,/\/)
对于其他AWK,这有点棘手,但基于保存名称的思想,这里有一个替代方案:数组中的值输入:

$ cat tst.awk
{ for(i=1;i<=NF;++i) if (split($i,t,/:/)==2) a[NR==FNR,FNR,t[1]] = t[2] }
NR==FNR { next }
a[1,FNR,"P"] == a[0,FNR,"P"] { print; next }
{ exit }

$ awk -f tst.awk file1 file2
A:1 P:3 C:3
A:1 P:4 C:4
$cat tst.awk
{for(i=1;i
如果您有GNU awk,则可以使用单词边界使match()更精确:

match($0,/\<P:[0-9]+\>/)
匹配($0,/\/)
对于其他AWK,这有点棘手,但基于保存名称的思想,这里有一个替代方案:数组中的值输入:

$ cat tst.awk
{ for(i=1;i<=NF;++i) if (split($i,t,/:/)==2) a[NR==FNR,FNR,t[1]] = t[2] }
NR==FNR { next }
a[1,FNR,"P"] == a[0,FNR,"P"] { print; next }
{ exit }

$ awk -f tst.awk file1 file2
A:1 P:3 C:3
A:1 P:4 C:4
$cat tst.awk

{for(i=1;i基于在进行比较之前读取整个第一个文件可能会非常低效,这里有一个解决方案,它在lockstep中读取两个文件。我省略了很多错误检查,但我添加了很多注释。(假设要匹配的对象是
awk
意义上的字段。)

$cat uptdiff.awk
#*last*命令行参数作为第二个文件。我们将其弹出
#如果命令行是唯一的命令行参数,那么
#stdin将隐式地成为第一个文件。
开始{f2=ARGV[--ARGC]}
#此函数用于将每个字段与其参数中的正则表达式进行比较,以及
#返回第一个匹配的。如果没有匹配项,则不返回任何内容。
函数get(pat,i){

对于(i=1;i基于在进行比较之前读取整个第一个文件可能会非常低效,这里有一个解决方案,它在lockstep中读取两个文件。我省略了很多错误检查,但我添加了很多注释。(假设要匹配的对象是
awk
意义上的字段。)

$cat uptdiff.awk
#*last*命令行参数作为第二个文件。我们将其弹出
#如果命令行是唯一的命令行参数,那么
#stdin将隐式地成为第一个文件。
开始{f2=ARGV[--ARGC]}
#此函数用于将每个字段与其参数中的正则表达式进行比较,以及
#返回第一个匹配的。如果没有匹配项,则不返回任何内容。
函数get(pat,i){

对于(i=1;iNo.我想打印文件1或文件2中P值相同的所有行。一旦P:24和P:12进行比较,它应该停止输出这些行。您想让文件1中的所有行后跟文件2中的行,还是让它们交错或其他方式?这两个文件中的行之间是否始终存在1对1的对应关系?Post包含几行预期输入(比如每个文件5行)和预期输出。“P:2”在哪里输出中的s来自?否。我希望打印文件1或文件2中P值相同的所有行。一旦比较P:24和P:12,它应该停止输出行。是否希望文件1中的所有行后跟文件2中的所有行,或者将它们交错或其他方式?lin之间是否始终存在1对1的对应关系在2个文件中添加es?发布几行预期输入(每个文件5行)和预期输出。“P:2”在哪里如果可能发生或不发生,则输出中的s来自?idk,但如果输入在
P:
字段后包含
P
,则输出将失败,例如
SP:fd P:24 N0 P V0
SP:fd P:24 N0 X:P V0
将导致
P[NR]
包含
V0
而不是
24
。idk是否可能发生,但如果输入在
P:
字段后包含
P
,则输入将失败,例如
SP:fdp:24 N0 P V0
SP:fdp:24 N0 X:P V0
将导致
P[NR]
包含
V0
而不是
24
。谢谢。这也很棒!谢谢。这也很棒!