【问题标题】:how can I supply bash variables as fields for print in awk如何在 awk 中提供 bash 变量作为打印字段
【发布时间】:2012-11-29 05:37:34
【问题描述】:

我目前正在尝试使用 awk 重新排列类似于以下内容的 .csv 文件:

stack,over,flow,dot,com

输出将是:

over,com,stack,flow,dot

(或任何其他顺序,仅以此为例)

当需要重新排列 csv 文件时,我一直在尝试使用以下内容:

first='$2'
second='$5'
third='$1'
fourth='$3'
fifth='$4'

awk -v a=$first -v b=$second -v c=$third -v d=$fourth -v e=$fifth -F '^|,|$' '{print $a,$b,$c,$d,$e}' somefile.csv

出于 awk/print 将 $a、$b、$c 等解释为字段编号的意图,因此结果如下:

{print $2,$5,$1,$3,$4}

并按该顺序打印出 csv 文件的字段,但不幸的是我还不能让它正常工作。我已经尝试了几种不同的方法,这似乎是最有希望的,但不幸的是还没有能够让任何解决方案正常工作。话虽如此,我想知道是否有人可以提出任何建议或指出我的缺陷,因为我现在很困惑,任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    使用简单的数字:

    first='2'
    second='5'
    third='1'
    fourth='3'
    fifth='4'
    
    awk -v a=$first -v b=$second -v c=$third -v d=$fourth -v e=$fifth -F '^|,|$' \
         '{print $a, $b, $c, $d, $e}' somefile.csv
    

    【讨论】:

    • 完美运行,谢谢!并且作为一个标记问题,我将如何让 print 的输出以逗号分隔,截至目前,输出由“over com stack flow dot”的空格分隔
    • OFS=","(输出字段分隔符)应该在 BEGIN 子句或“每一行”语句(或命令行)中执行此操作。
    【解决方案2】:

    另一种更短的例子:

    aa='$2'
    bb='$1'
    cc='$3'
    
    awk -F '^|,|$' "{print $aa,$bb,$cc}" somefile.csv
    

    【讨论】:

      【解决方案3】:

      您已经获得了特定问题的答案,但您是否考虑过仅将订单指定为字符串而不是每个单独的字段?例如:

      order="2 5 1 3 4"
      
      awk -v order="$order" '
         BEGIN{ FS=OFS=","; n=split(order,a," ") }
         { for (i=1;i<n;i++) printf "%s%s",$(a[i]),OFS; print $(a[i]) }
      ' somefile.csv
      

      这样,如果您想添加/删除字段或更改顺序,您只需简单地重新排列第一行中的数字,而不必弄乱一堆硬编码的变量等。

      请注意,我更改了您的 FS,因为它不需要那么复杂。此外,您不需要 shell 变量“order”,您可以显式填充同名的 awk 变量,我刚开始使用 shell 变量,因为您已经开始使用 shell 变量,所以也许您有原因。

      【讨论】:

        猜你喜欢
        • 2014-05-13
        • 2010-12-22
        • 1970-01-01
        • 2019-12-21
        • 1970-01-01
        • 2023-03-24
        • 2018-11-17
        • 2020-06-22
        • 1970-01-01
        相关资源
        最近更新 更多