Reputation: 3512
Sorry for a bad title, please feel free to adjust it to something more appropriate.
How can I index arrays using zsh
or bash
scripting as I am doing for lists in R
below;
# Some lists with the same number of elements
list1 <- list(sample(letters,10))
list2 <- list(1:10)
for(i in 1:length(list1)) {
a <- list1[[1]][i]
b <- list2[[1]][i]
}
print(paste(a,b)) # Or some other function where a and b are used simultaneously
[1] "f 1"
[1] "e 2"
[1] "t 3"
[1] "s 4"
[1] "c 5"
[1] "o 6"
[1] "p 7"
[1] "y 8"
[1] "k 9"
[1] "d 10"
The below code obviously only prints the last elements from both lists, since I have not found a way to do 1 to the length of array
# dummy data
echo 'A 1' > A.txt
echo 'B 1' > B.txt
echo 'C 1' > C.txt
echo 'A,2' > A.csv
echo 'B,2' > B.csv
echo 'C,2' > C.csv
txtlist=(*.txt) # create an array of .txt files
csvlist=(*.csv) # create an array of .csv files
# in zsh $#array returns the length of the array, so
for i in $#txtlist; do
a=$txtlist[i]
b=$csvlist[i]
echo $a,$b # Or some other function where a and b are used simultaneously
done
#C.txt,C.csv
Any pointers would be very much appreciated, thanks!
Upvotes: 0
Views: 1665
Reputation: 531325
Use the following syntax:
$ x=(1 2 3 4 5)
$ print $x
1 2 3 4 5
$ print ${x:1}
2 3 4 5
Upvotes: 1
Reputation: 18349
bash
and zsh
both know C-style for-loops:
From man 1 zshmisc
(man 1 bash
is essentially the same):
for (( [expr1] ; [expr2] ; [expr3] )) do list done
The arithmetic expression expr1 is evaluated first (see the section `Arithmetic Evaluation'). The arithmetic expression expr2 is repeatedly
evaluated until it evaluates to zero and when non-zero, list is executed and the arithmetic expression expr3 evaluated. If any expression is
omitted, then it behaves as if it evaluated to 1.
Example for zsh
:
for (( i=1; i<=$#txtlist; i++ )); do
echo "$txtlist[$i]" "$csvlist[$i]"
done
Example for bash
:
for (( i=0; i<=${#txtlist[@]}; i++ )); do
echo "${txtlist[$i]}" "${csvlist[$i]}"
done
Upvotes: 4
Reputation: 16556
I am not sure to understand your example, I'm sorry, but, you can do loop like that in bash :
myLength=${#myArray[@]}
for (( i=1; i<${myLength}; i++ ));
do
echo ${myArray[$i]}
done
Upvotes: 2