Bash awk处理前两行,然后处理下两行,依此类推
假设我有一个由两个文件创建的文件,一个是旧文件,另一个是通过在主键上使用cat&sort更新的文件 文件1Bash awk处理前两行,然后处理下两行,依此类推,bash,unix,awk,gawk,Bash,Unix,Awk,Gawk,假设我有一个由两个文件创建的文件,一个是旧文件,另一个是通过在主键上使用cat&sort更新的文件 文件1 102310863||7097881||6845193||271640||06007709532577|||| 102310863||7097881||6845123||271640||06007709532577|||| 102310875||7092992||6840808||023740||10034500635650|||| 102310875||7092992||6840818|
102310863||7097881||6845193||271640||06007709532577||||
102310863||7097881||6845123||271640||06007709532577||||
102310875||7092992||6840808||023740||10034500635650||||
102310875||7092992||6840818||023740||10034500635650||||
所以这个文件的模式是第1行=旧值
&第2行=更新值
&依此类推
现在我想以这样一种方式处理文件,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($0, old_data, "[|]{2}")
new=1
next
}
new==1 {
split($0, 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||||
$cat join.awk
开始{new=0;FS=“[|]{2}”;OFS=“||”}
新==0{
拆分($0,旧的_数据,“[|]{2}”)
新=1
下一个
}
新==1{
拆分($0,新的|u数据,“[|]{2}”)
对于(i=1;i这个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-F'\\\\\\\\\\''{
getline new;
拆分(新的,新的数组“\\\\\\\\\\”);
对于(i=1;i$cat tst.awk
开始{FS=“[|][|]”OFS=“| |”}
NR%2{拆分($0,旧);下一个}
{
对于(i=1;iUseawk-F'[|]{2}“
,在我发现了awk和
部分后,我正考虑做类似的事情。或者,awk-F'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\.投票赞成。
$ cat tst.awk
BEGIN { FS="[|][|]"; OFS="||" }
NR%2 { split($0,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||||