我有两个长度相等的列表,单个项目中没有空格:
list1="a b c"
list2="1 2 3"
Run Code Online (Sandbox Code Playgroud)
我想并行迭代这两个列表,将1与b配对,等等:
a 1
b 2
c 3
Run Code Online (Sandbox Code Playgroud)
我正在尝试支持现代便携式Bourne shell,因此Bash/ksh数组不可用.如果可能的话,向外推出awk是可以接受的,但我宁愿保持这种状态.
感谢您提供的任何指示!
Rya*_*ham 14
可能不便携(看看所有那些bash-isms!),但它很容易阅读,其他人可能觉得它很有用......
list1="a b c"
list2="1 2 3"
array1=($list1)
array2=($list2)
count=${#array1[@]}
for i in `seq 1 $count`
do
echo ${array1[$i-1]} ${array2[$i-1]}
done
Run Code Online (Sandbox Code Playgroud)
这应该是一个相当干净的解决方案,但除非您使用bash进程替换,否则它需要使用临时文件。我不知道这比每次迭代调用cutand是好还是坏sed。
#!/bin/sh
list1="1 2 3"
list2="a b c"
echo $list1 | sed 's/ /\n/g' > /tmp/a.$$
echo $list2 | sed 's/ /\n/g' > /tmp/b.$$
paste /tmp/a.$$ /tmp/b.$$ | while read item1 item2; do
echo $item1 - $item2
done
rm /tmp/a.$$
rm /tmp/b.$$
Run Code Online (Sandbox Code Playgroud)
这有点 hacky 但可以完成工作:
#!/bin/sh
list1="1 2 3"
list2="a b c"
while [ -n "$list1" ]
do
head1=`echo "$list1" | cut -d ' ' -f 1`
list1=`echo "$list1" | sed 's/[^ ]* *\(.*\)$/\1/'`
head2=`echo "$list2" | cut -d ' ' -f 1`
list2=`echo "$list2" | sed 's/[^ ]* *\(.*\)$/\1/'`
echo $head1 $head2
done
Run Code Online (Sandbox Code Playgroud)