如何提供 bash 变量作为字段以在 awk 中打印



我目前正在尝试使用 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

目的是将 $a、$b、$c 等解释为字段编号,因此结果如下:

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

并按该顺序打印出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

另一种方式,用一个简短的例子:

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

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

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变量开始了,所以也许你有原因。

相关内容

  • 没有找到相关文章

最新更新