awk 处理前两行,然后处理下两行,依此类推
awk to process the first two lines then the next two and so on
假设我有一个文件,它是我从两个文件创建的,一个是旧文件,另一个是通过在主键上使用 cat & sort 更新的文件。
文件 1
102310863||7097881||6845193||271640||06007709532577||||
102310863||7097881||6845123||271640||06007709532577||||
102310875||7092992||6840808||023740||10034500635650||||
102310875||7092992||6840818||023740||10034500635650||||
所以这个文件的模式是 line 1 = old value
& line 2 = updated value
等等..
现在我想以这样的方式处理文件,即 awk 首先处理文件的前两行并找出差异,然后继续处理接下来的两行。
现在流程是
if($[old record]!=$[new record])
i= [new record]#[old record];
期望的输出
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
更新版本,感谢@martin 的双重 |
技巧:
$ cat join.awk
BEGIN {new=0; FS="[|]{2}"; OFS="||"}
new==0 {
split([=10=], old_data, "[|]{2}")
new=1
next
}
new==1 {
split([=10=], new_data, "[|]{2}")
for (i = 1; i <= 7; i++) {
if (new_data[i] != old_data[i]) new_data[i] = new_data[i] "#" old_data[i]
}
print new_data[1], new_data[2], new_data[3], new_data[4], new_data[5], new_data[6], new_data[7]
new = 0
}
$ awk -f join.awk data.txt
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
这个awk
可以帮助:
$ awk -F '\|\|' '{
getline new;
split(new, new_array, "\|\|");
for(i=1;i<=NF;i++) {
if($i != new_array[i]) {
$i = new_array[i]"#"$i;
}
}
} 1' OFS="||" < input_file
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
我认为,您的 awk
水平足以理解上述代码。跳过解释。
$ cat tst.awk
BEGIN { FS="[|][|]"; OFS="||" }
NR%2 { split([=10=],old); next }
{
for (i=1;i<=NF;i++) {
if (old[i] != $i) {
$i = $i "#" old[i]
}
}
print
}
$
$ awk -f tst.awk file
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
假设我有一个文件,它是我从两个文件创建的,一个是旧文件,另一个是通过在主键上使用 cat & sort 更新的文件。
文件 1
102310863||7097881||6845193||271640||06007709532577||||
102310863||7097881||6845123||271640||06007709532577||||
102310875||7092992||6840808||023740||10034500635650||||
102310875||7092992||6840818||023740||10034500635650||||
所以这个文件的模式是 line 1 = old value
& line 2 = updated value
等等..
现在我想以这样的方式处理文件,即 awk 首先处理文件的前两行并找出差异,然后继续处理接下来的两行。
现在流程是
if($[old record]!=$[new record])
i= [new record]#[old record];
期望的输出
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
更新版本,感谢@martin 的双重 |
技巧:
$ cat join.awk
BEGIN {new=0; FS="[|]{2}"; OFS="||"}
new==0 {
split([=10=], old_data, "[|]{2}")
new=1
next
}
new==1 {
split([=10=], new_data, "[|]{2}")
for (i = 1; i <= 7; i++) {
if (new_data[i] != old_data[i]) new_data[i] = new_data[i] "#" old_data[i]
}
print new_data[1], new_data[2], new_data[3], new_data[4], new_data[5], new_data[6], new_data[7]
new = 0
}
$ awk -f join.awk data.txt
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
这个awk
可以帮助:
$ awk -F '\|\|' '{
getline new;
split(new, new_array, "\|\|");
for(i=1;i<=NF;i++) {
if($i != new_array[i]) {
$i = new_array[i]"#"$i;
}
}
} 1' OFS="||" < input_file
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||
我认为,您的 awk
水平足以理解上述代码。跳过解释。
$ cat tst.awk
BEGIN { FS="[|][|]"; OFS="||" }
NR%2 { split([=10=],old); next }
{
for (i=1;i<=NF;i++) {
if (old[i] != $i) {
$i = $i "#" old[i]
}
}
print
}
$
$ awk -f tst.awk file
102310863||7097881||6845123#6845193||271640||06007709532577||||
102310875||7092992||6840818#6840808||023740||10034500635650||||