2012-11-29 34 views
1

我现在想使用awk来重新排列.csv文件类似于下面的打印领域:我如何可以提供bash的变量在awk中

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 /打印解释$ A,$ B,$ c等为外地号码的意图,所以它出来以下几点:

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

,并打印出的字段的顺序csv文件,但不幸的是,我还没有能够得到这个工作正常。我尝试了几种不同的方法,这看起来像最有前途的,但不幸的是还没有能够得到任何解决方案,以正常工作。话虽如此,我想知道是否有人可以提出任何建议或指出我的缺陷,因为我在这个时候难倒了,任何帮助都将非常感谢,谢谢!

回答

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 
+0

完美运作,谢谢!并作为一种标签问题,我怎么会得到打印的输出为逗号分隔,因为现在输出被空格分隔“over com stack flow dot” – lacrosse1991

+0

OFS =“,”(输出字段分隔符)应该在BEGIN子句中或'every row'语句中(或在命令行中)执行。 –

+0

也按预期工作,再次感谢! – lacrosse1991

1

另一种方法用更短的例子:

aa='$2' 
bb='$1' 
cc='$3' 

awk -F '^|,|$' "{print $aa,$bb,$cc}" somefile.csv 
+0

jon有点揍你一拳,你的建议也很完美,谢谢:) – lacrosse1991

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变量,“order”,你可以显式地填充相同名字的awk变量,我刚刚开始使用shell变量,因为你已经开始使用shell变量,所以也许你有一个理由。