awk - 两个文件和 return 之间的几列的部分匹配,两个文件的一个衬里用逗号连接
awk - partial match of several columns between two files and return a one liner of both files concatenated with comma
我有两个文件,每个文件包含以下内容:
/tmp/mydir-1
:
direction=1, code=a b c d, time=xxxx
direction=1, code=f x fdfsdf sdfs, time=xxxx
direction=1, code=a b c f, time=xxxx
和第二个文件/tmp/mydir-2
:
direction2=2, code2=a b c fsd, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=a b c ff, time2=xxxx
我想在 file2 中匹配,只匹配包含 code2=XXX
的行,匹配第一个文件中的 code=XXX
,并且 return 两个文件的每一行由 [= 连接27=].
这意味着如果这两个文件之间唯一匹配的行是:
direction=1, code=f x fdfsdf sdfs, time=xxxx
和
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
所以 return:
direction=1, code=f x fdfsdf sdfs, time=xxxx, direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
我是 awk 的新手..我需要做一些事情,但仍然不知道如何将这些事情联系在一起。
我知道用这个我可以拆分 code 或 code2 列并在 =
之后打印实际值:
cat /tmp/mydir-1 | awk -F ', ' '{split(,aa,"="); print aa[2]}'
这个returns:
a b c d
f x fdfsdf sdfs
a b c f
现在我正在尝试按 =
拆分代码列并比较两个文件之间的值,这就是我出错的地方。
当我执行这个时:
awk -F ', ' 'FNR==NR {split(,aa,"="); a[aa[2]]; next} split(, aaa, "="); aaa[2] in a' /tmp/mydir-1 /tmp/mydir-2
我变高了 线条是 mydir-2
重复的:
direction2=2, code2=a b c f, time2=xxxx
direction2=2, code2=a b c f, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=a b c ff, time2=xxxx
所以这就是我卡住的地方。我猜我正在以某种方式将第二个文件与自身进行比较?不太确定如何从这里继续。
如能提供有关此问题的任何信息,我们将不胜感激。
谢谢
更新
感谢@KamilCuk 的更新。
我更改了变量名,这是命令:
awk -F ', ' 'FNR==NR {split(,f1split,"="); f1[f1split[2]]; next} {split(, f2plit, "=");} f2split[2] in f1' /tmp/mydir-1 /tmp/mydir-2
如@KamilCuk 所述,我在 {}
中为第二个文件添加了第二个拆分,当我执行它时,结果为空。
变量名称以及我认为它们的含义:
f1: first file
f2: 2nd file
f1split: first file 'code' split
f2split: 2nd file 'code2' split
关于 awk 代码与第一个文件以及第二个文件相关的问题,我是否正确理解了 awk 语法?
awk 'FNR==NR {<CODE FOR FIRST FILE>} <CODE FOR 2nd FILE>' /tmp/mydir-1 /tmp/mydir-2
split
returns 元素的数量,所以它是非零的,所以它打印了这一行。放在里面 {
}
awk -F ', ' '
FNR==NR{
split(, aa, "=");
a[aa[2]];
next
}
# empty non-zero expression prints the line
# put it inside { } to silence output
{ split(, aaa, "=") }
# Use different variables names then a aa aaa....
aaa[2] in a
' /tmp/mydir-1 /tmp/mydir-2
$ cat tst.awk
BEGIN { FS="[=,]"; OFS=", " }
NR==FNR {
file1[] = [=10=]
next
}
in file1 {
print file1[], [=10=]
}
$ awk -f tst.awk file1 file2
direction=1, code=f x fdfsdf sdfs, time=xxxx, direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
我有两个文件,每个文件包含以下内容:
/tmp/mydir-1
:
direction=1, code=a b c d, time=xxxx
direction=1, code=f x fdfsdf sdfs, time=xxxx
direction=1, code=a b c f, time=xxxx
和第二个文件/tmp/mydir-2
:
direction2=2, code2=a b c fsd, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=a b c ff, time2=xxxx
我想在 file2 中匹配,只匹配包含 code2=XXX
的行,匹配第一个文件中的 code=XXX
,并且 return 两个文件的每一行由 [= 连接27=].
这意味着如果这两个文件之间唯一匹配的行是:
direction=1, code=f x fdfsdf sdfs, time=xxxx
和
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
所以 return:
direction=1, code=f x fdfsdf sdfs, time=xxxx, direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
我是 awk 的新手..我需要做一些事情,但仍然不知道如何将这些事情联系在一起。
我知道用这个我可以拆分 code 或 code2 列并在 =
之后打印实际值:
cat /tmp/mydir-1 | awk -F ', ' '{split(,aa,"="); print aa[2]}'
这个returns:
a b c d
f x fdfsdf sdfs
a b c f
现在我正在尝试按 =
拆分代码列并比较两个文件之间的值,这就是我出错的地方。
当我执行这个时:
awk -F ', ' 'FNR==NR {split(,aa,"="); a[aa[2]]; next} split(, aaa, "="); aaa[2] in a' /tmp/mydir-1 /tmp/mydir-2
我变高了 线条是 mydir-2
重复的:
direction2=2, code2=a b c f, time2=xxxx
direction2=2, code2=a b c f, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=a b c ff, time2=xxxx
所以这就是我卡住的地方。我猜我正在以某种方式将第二个文件与自身进行比较?不太确定如何从这里继续。
如能提供有关此问题的任何信息,我们将不胜感激。
谢谢
更新
感谢@KamilCuk 的更新。
我更改了变量名,这是命令:
awk -F ', ' 'FNR==NR {split(,f1split,"="); f1[f1split[2]]; next} {split(, f2plit, "=");} f2split[2] in f1' /tmp/mydir-1 /tmp/mydir-2
如@KamilCuk 所述,我在 {}
中为第二个文件添加了第二个拆分,当我执行它时,结果为空。
变量名称以及我认为它们的含义:
f1: first file
f2: 2nd file
f1split: first file 'code' split
f2split: 2nd file 'code2' split
关于 awk 代码与第一个文件以及第二个文件相关的问题,我是否正确理解了 awk 语法?
awk 'FNR==NR {<CODE FOR FIRST FILE>} <CODE FOR 2nd FILE>' /tmp/mydir-1 /tmp/mydir-2
split
returns 元素的数量,所以它是非零的,所以它打印了这一行。放在里面 {
}
awk -F ', ' '
FNR==NR{
split(, aa, "=");
a[aa[2]];
next
}
# empty non-zero expression prints the line
# put it inside { } to silence output
{ split(, aaa, "=") }
# Use different variables names then a aa aaa....
aaa[2] in a
' /tmp/mydir-1 /tmp/mydir-2
$ cat tst.awk
BEGIN { FS="[=,]"; OFS=", " }
NR==FNR {
file1[] = [=10=]
next
}
in file1 {
print file1[], [=10=]
}
$ awk -f tst.awk file1 file2
direction=1, code=f x fdfsdf sdfs, time=xxxx, direction2=2, code2=f x fdfsdf sdfs, time2=xxxx