簡體   English   中英

如何在 awk 中提供 bash 變量作為打印字段

[英]how can I supply bash variables as fields for print in 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

意圖 awk/print 將 $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 變量,所以也許您有原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM