/ / w jaki sposób mogę dostarczyć zmienne bash jako pola do drukowania w awk - bash, csv, awk

jak mogę dostarczyć zmienne bash jako pola do drukowania w awk - bash, csv, awk

Obecnie próbuję użyć awk, aby zmienić kolejność pliku .csv, który jest podobny do następującego:

stack,over,flow,dot,com

a wyjście będzie:

over,com,stack,flow,dot

(lub jakakolwiek inna kolejność, po prostu używając tego jako przykładu)

i kiedy przychodzi czas na zmianę pliku csv, próbuję użyć następującego:

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

z intencją awk / print interpretując $ a, $ b, $ c, itp. jako numery pól, tak by wyglądało to następująco:

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

i wydrukuj pola pliku csv w tymzamówienie, ale niestety nie udało mi się jeszcze tego poprawnie uruchomić. Wypróbowałem kilka różnych metod, które wydawały mi się najbardziej obiecujące, ale niestety nie udało mi się jeszcze prawidłowo rozwiązać żadnego problemu, ale zastanawiałem się, czy ktoś mógłby podać jakieś sugestie lub wskazać moją wadę jako Jestem zaskoczony w tym momencie, każda pomoc będzie bardzo ceniona, dzięki!

Odpowiedzi:

1 dla odpowiedzi № 1

Użyj prostych liczb:

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 dla odpowiedzi nr 2

Innym sposobem z krótszym przykładem:

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

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

0 dla odpowiedzi № 3

Masz już odpowiedź na swoje konkretne pytanie, ale czy bierzesz pod uwagę, że po prostu określasz zamówienie jako ciąg zamiast pojedynczego pola? Na przykład:

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

W ten sposób, jeśli chcesz dodawać / usuwać pola lub zmieniać kolejność, po prostu przeliczysz numery w pierwszym wierszu, zamiast bałaganu z paczką zmiennych o zmiennym kodzie, itp.

Zauważ, że zmieniłem twoje FS, ponieważ nie było potrzebybo to jest takie skomplikowane. Ponadto, nie potrzebujesz zmiennej powłoki, "order", możesz po prostu wypełnić zmienną awk o tej samej nazwie jawnie, zacząłem od zmiennej powłoki, ponieważ zaczynałeś od zmiennych powłoki, więc może masz powód.