Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash awk处理前两行,然后处理下两行,依此类推_Bash_Unix_Awk_Gawk - Fatal编程技术网

Bash awk处理前两行,然后处理下两行,依此类推

Bash 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|

假设我有一个由两个文件创建的文件,一个是旧文件,另一个是通过在主键上使用cat&sort更新的文件

文件1

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;iUse
awk-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||||