代码之家  ›  专栏  ›  技术社区  ›  Gildo Conte

如何使用sed和/或awk按照动态格式对文件中每行的元素重新排序

  •  0
  • Gildo Conte  · 技术社区  · 6 年前

    Peter:Connor:14:40kg
    George:Head:56:60kg
    

    我有一个列表函数,它接受一个“format”字符串作为参数。

    %N, %S, %A, %W

    这些缩写可以前后加任意数量的字符。

    {%A} [%W] %S %N
    

    %S|%N|%A[[%W]]
    

    我需要对数据进行重新排序,使其符合所需的格式。因为它是函数中的一个参数,所以我无法事先知道我将收到什么。

    {14} [40kg] Connor Peter
    

    第二个例子

    Connor|Peter|14[[40kg]]
    

    2 回复  |  直到 6 年前
        1
  •  0
  •   Ed Morton    6 年前

    假设 I might receive... 使您能够将具有该值的字符串传递给awk:

    $ cat tst.awk
    BEGIN {
        FS = ":"
        tmp = fmt
        sub(/^[^[:alpha:]]+/,"",tmp)
        split(tmp,flds,/[^[:alpha:]]+/)
        gsub(/[[:alpha:]]+/,"%s",fmt)
        fmt = fmt ORS
    }
    NR==1 {
        for (i=1; i<=NF; i++) {
            f[$i] = i
        }
        next
    }
    { printf fmt, $(f[flds[1]]), $(f[flds[2]]), $(f[flds[3]]), $(f[flds[4]]) }
    
    $ awk -v fmt='{age} [kilo] surname name' -f tst.awk file
    {14} [40kg] Connor Peter
    {56} [60kg] Head George
    
    $ awk -v fmt='surname|name|age[[kilo]]' -f tst.awk file
    Connor|Peter|14[[40kg]]
    Head|George|56[[60kg]]
    

    要让上面的内容起作用,必须有一些列的名称,如果您愿意,可以在脚本中硬编码,但我将其作为标题行添加到您的CSV中:

    $ cat file
    name:surname:age:kilo
    Peter:Connor:14:40kg
    George:Head:56:60kg
    
        2
  •  0
  •   F. Knorr    6 年前
    awk 'BEGIN{FS=":"; OFS=" "}{print "{"$3"}","["$4"]",$2,$1}' inputFile
    

    给予:

    {14} [40kg] Connor Peter
    {56} [60kg] Head George
    

    awk 'BEGIN{FS=":"; OFS="|"}{print $2,$1,$3"[["$2"]]"}' inputFile
    

    Connor|Peter|14[[Connor]]
    Head|George|56[[Head]]