我目前正在尝试使用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文件的字段,但遗憾的是我还没能让它正常工作。我尝试了几种不同的方法,这看起来像是最有希望的,但遗憾的是还没有能够得到任何解决方案才能正常工作。话虽如此,我想知道是否有人可能提出任何建议或指出我的缺陷,因为我在这个时间难倒,任何帮助将不胜感激,谢谢!
答案 0 :(得分: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
答案 1 :(得分:1)
使用较短示例的另一种方式:
aa='$2'
bb='$1'
cc='$3'
awk -F '^|,|$' "{print $aa,$bb,$cc}" somefile.csv
答案 2 :(得分:0)
您已经得到了具体问题的答案,但您是否考虑过将订单指定为字符串而不是每个字段?例如:
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变量,&#34; order&#34;你可以只显式地填充同名的awk变量,我刚开始使用shell变量,因为你已经开始使用shell变量了也许你有理由。