在 bash 中使用位置值将字符串转换为数组

发布于 2024-12-08 04:50:16 字数 254 浏览 0 评论 0原文

我试图查看很多类似的问题,但我有一个特定的查询。我有两组或多组字符串(空格分隔值)。我想循环遍历

firstString="f1 f2 f3 f4"
secondString="s1 s2 s3 s4"

我想要类似

f1-s1
f2-s2
f3-s3
f4-s4

(在单个循环中)

的东西,我必须能够在单个循环中获取第二个和更多数组的位置值。

I tried to look through a lot of similar questions but I have a specific query. I have two or more sets of strings (space separated values). I want to loop through

firstString="f1 f2 f3 f4"
secondString="s1 s2 s3 s4"

I want something like

f1-s1
f2-s2
f3-s3
f4-s4

(in a single loop)

I must be able to take the positional value of the second and further arrays in a single loop.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

偏爱自由 2024-12-15 04:50:16

好吧,如果您首先使用 tr 将所有空格替换为换行符,以便将每个值放在单独的行上,那么 paste 将解决您的问题:

$ cat a b
f1
f2
f3
f4
s1
s2
s3
s4

$ paste -d- a b
f1-s1
f2-s2
f3-s3
f4-s4

Pure bash解决方案:

#!/bin/bash

firstString='f1 f2 f3 f4'
secondString='s1 s2 s3 s4'

read -ra FIRST <<< "$firstString"
read -ra SECOND <<< "$secondString"

index=0
for i in ${FIRST[@]}
do
    echo $i-${SECOND[$index]}
    ((index++))
done

Well, if you first replace all spaces with a new-line, using tr so that you have each value on a separate line, then paste will solve your problem:

$ cat a b
f1
f2
f3
f4
s1
s2
s3
s4

$ paste -d- a b
f1-s1
f2-s2
f3-s3
f4-s4

Pure bash solution:

#!/bin/bash

firstString='f1 f2 f3 f4'
secondString='s1 s2 s3 s4'

read -ra FIRST <<< "$firstString"
read -ra SECOND <<< "$secondString"

index=0
for i in ${FIRST[@]}
do
    echo $i-${SECOND[$index]}
    ((index++))
done
天暗了我发光 2024-12-15 04:50:16

您可以使用 bash 内置数组:

first=(f1 f2 f3 f4)
second=(s1 s2 s3 s4)
for (( i = 0; i < ${#first[*]}; i++ )); do
    echo ${first[$i]}-${second[$i]}
done

You could make use of bash built-in arrays:

first=(f1 f2 f3 f4)
second=(s1 s2 s3 s4)
for (( i = 0; i < ${#first[*]}; i++ )); do
    echo ${first[$i]}-${second[$i]}
done
°如果伤别离去 2024-12-15 04:50:16

请参阅下面使用 awk 进行的测试:

kent$  firstStr="f1 f2 f3 f4"
kent$  secondStr="s1 s2 s3 s4"

#now we have two variable


kent$  echo 1|awk -v two=$secondStr -v one=$firstStr '{split(one,a);split(two,b);for(i=1;i<=length(a);i++)print a[i]"-"b[i]}' 
f1-s1
f2-s2
f3-s3
f4-s4

see the test with awk below:

kent$  firstStr="f1 f2 f3 f4"
kent$  secondStr="s1 s2 s3 s4"

#now we have two variable


kent$  echo 1|awk -v two=$secondStr -v one=$firstStr '{split(one,a);split(two,b);for(i=1;i<=length(a);i++)print a[i]"-"b[i]}' 
f1-s1
f2-s2
f3-s3
f4-s4
无声无音无过去 2024-12-15 04:50:16

您可以轻松地以便携式方式完成此操作:

set $firstString
for s in $secondString; do
  echo "$1-$s"
  shift
done

You can easily do it in a portable manner:

set $firstString
for s in $secondString; do
  echo "$1-$s"
  shift
done
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文