Permalänk
Medlem

Hjälp med bashscript

Hej hej

Hoppas att det finns någon bashkung därute som kan hjälpa mig med ett skript. Jag försöker få till ett skript som läser en txt-tabell med två kolumner och sen radvis använder informationen från de två kolumnerna till olika saker. Raderna (A-C nedan) föreställer 3 directories (en för varje studiedeltagare) som alla har eftertraktad information i olikt-kallade undermappar (deltagare As mapp heter 1, deltagare Bs mapp heter 2 etc.).

A 1
B 2
C 3

Jag vill att skriptet går igenom alla deltagare, kollar upp vad det står i kolumn två för varje deltagare och utför en command: input-output [mitt command] /dir/{första kolumnen}/{andra kolumnen} [input] {första kolumnen} [output]

Alltså:

input-output /dir/A/1 A
input-output /dir/B/2 B
input-output /dir/C/3 C

Tips någon?

Permalänk
Medlem

Det går rätt enkelt via en one-liner:

cat filnamn.txt | awk '{print "/dir/"$1"/"$2" "$1}' | xargs -0 input-output

Eventuellt kan detta behöva justeras för just ditt ändamål, men det förklarar principen. Hoppas detta hjälper dig vidare.

Permalänk
Medlem

awk verkar vara rätt väg att gå. Tack! Skulle helst vilja integrera detta i en for-loop, typ:

Citat:

for `cat files.txt` [något mer här antar jag...]; do input-output /.../$1/$2 $2; done

Får följande resultat med följande kod:

Citat:

for allfiles in `cat files.txt | awk '{print $1"/"$2}'`; do echo input-output $allfiles;done

Citat:

input-output A/1
input-output B/2
input-output C/3

Skulle alltså behöva att $1 dök upp igen som output på något sätt. Förslag?

Skrivet av dopedog:

Det går rätt enkelt via en one-liner:

cat filnamn.txt | awk '{print "/dir/"$1"/"$2" "$1}' | xargs -0 input-output

Eventuellt kan detta behöva justeras för just ditt ändamål, men det förklarar principen. Hoppas detta hjälper dig vidare.

Permalänk
Medlem

Ingen snygg lösning, men detta tycks fungera!

Citat:

for allfiles in `cat files.txt | awk '{print $1"/"$2}'`; do echo input-output $allfiles/ ${allfiles//"/"*/};done

Tack för hjälpen!

Permalänk
Medlem

kommandot read är annars trevligt för detta, den kan arrayer vilket gör allt mycket trevligare att hantera.

while read -a ARR; do echo input-output /dir/${ARR[0]}/${ARR[1]} ${ARR[0]} done < files.txt