【问题标题】:awk get the nextlineawk 获取下一行
【发布时间】:2017-06-16 20:49:00
【问题描述】:

我正在尝试使用 awk 来格式化包含多行的文件。
文件内容:

ABC;0;1
ABC;0;0;10
ABC;0;2
EFG;0;1;15
HIJ;2;8;00
KLM;4;18;12
KLM;6;18;1200
KLM;10;18;14
KLM;1;18;15

想要的结果:

ABC;0;1;10;2
EFG;0;1;15
HIJ;2;8;00
KLM;4;18;12;1200;14;15

我正在使用下面的代码:

awk -F ";" '{
        ligne= ligne $0
        ma_var = $1
        {getline
        if($1 != ma_var){
            ligne= ligne "\n" $0
        }
        else {
        ligne= ligne";"NF
        }
        }   
}
END {
    print ligne
} ' ${FILE_IN} > ${FILE_OUT}

objectif是将下一行的第一列与当前行的第一列进行比较,如果匹配则将下一行的最后一列添加到当前行,并删除下一行,否则打印下一行行。

亲切的问候,

【问题讨论】:

  • awk -F ";" '{if (a[$1]=="") a[$1]=$0; else a[$1]=a[$1]";"$NF} END{for(i in a) print a[i]}' file
  • if (a[$1]=="") a[$1]=$0; else a[$1]=a[$1]";"$NF = a[$1]=(a[$1]=="" ? $0 : a[$1] FS $NF)。只是冗余略少。显然,这种方法会将整个文件读入内存并以随机顺序输出行,但也许没关系。恕我直言,您应该将其发布为答案。
  • 输入文件是否排序?当最后一行的第一个字段与第一行匹配时,是否要追加最后一个字段?

标签: bash awk


【解决方案1】:

与生活一样,根据已经发生的事情(上一行)比将要发生的事情(下一行)更容易做出决定。将您的要求重新声明为the objective is to compare the first column of the current line to the first column the previous line, if it matches then add the last column of the current line to the previous line, and delete the current line, else print the current line.,实现它的代码变得相对简单:

$ cat tst.awk
BEGIN { FS=OFS=";" }
$1 == p1 { prev = prev OFS $NF; next }
{ if (NR>1) print prev; prev=$0; p1=$1 }
END { print prev }

$ awk -f tst.awk file
ABC;0;1;10;2
EFG;0;1;15
HIJ;2;8;00
KLM;4;18;12;1200;14;15

如果您想再次使用getline,请确保在做出决定之前完全了解http://awk.freeshell.org/AllAboutGetline 讨论的所有内容。

【讨论】:

    【解决方案2】:

    我会采取与 Ed 稍有不同的方法:

     $ awk '$1 == p { printf ";%s", $NF; next } NR > 1 { print "" } {p=$1; 
        printf "%s" , $0} END{print ""}' FS=\; input
    

    在每一行,检查第一列是否与前一列匹配。如果是这样,只需打印最后一个字段。如果不是,则打印整行,不带尾随换行符。

    【讨论】:

      猜你喜欢
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      相关资源
      最近更新 更多