为了账号安全,请及时绑定邮箱和手机立即绑定

在bash中遍历值对

在bash中遍历值对

慕姐8265434 2019-06-23 14:55:17
在bash中遍历值对我有10个文本文件,我想paste每个文件与它的对,这样我有5个总文件。我尝试了以下几点:for i in 4_1 5_1 6_1 7_1 8_1dofor j in 4_2 5_2 6_2 7_2 8_2dopaste ${i}.txt ${j}.txt > ${i}.${j}.txtdonedone但是,这段代码结合了所有可能的组合,而不仅仅是组合匹配的对。所以我想要文件4_1.txt成对4_2.txt, 5_1.txt带着5_2.txt等
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

如果要使用一个变量并对其执行和操作,只需使用一个循环:

for file in 4 5 6 7 8do
   paste "${file}_1" "${file}_2"done

这就行了

paste 4_1 4_2paste 5_1 5_2...


查看完整回答
反对 回复 2019-06-23
?
呼如林

TA贡献1798条经验 获得超3个赞

我同意fedorqui目前在提出的问题中提出的答案。以下只是提供一些更一般的答案。

另一种常用的方法(对于bash 4.0或更新版本)是将您的对存储在一个关联数组中:

declare -A pairs=( [4_1]=4_2 [5_1]=5_2 [6_1]=6_2 [7_1]=7_2 [8_1]=8_2 )for i in "${!pairs[@]}"; do
  j=${pairs[$i]}
  paste "$i.txt" "$j.txt" >"${i}.${j}.txt"done

另一个(与bash的旧版本兼容)是使用多个常规数组:

is=( 4_1 5_1 6_1 7_1 8_1 )js=( 4_2 5_2 6_2 7_2 8_2 )for idx in "${!is[@]}"; do
  i=${is[$idx]}
  j=${js[$idx]}
  paste "$i.txt" "$j.txt" >"$i.$j.txt"done


查看完整回答
反对 回复 2019-06-23
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

可以使用关联数组:

animals=(dog cat mouse)declare -A size=(
  [dog]=big  [cat]=medium  [mouse]=small)declare -A sound=(
  [dog]=barks  [cat]=purrs  [mouse]=cheeps)for animal in "${animals[@]}"; do
  echo "$animal is ${size[$animal]} and it ${sound[$animal]}"done

这允许你遍历对,三倍,等等,学分:最初的想法是取自@CharlesDuffy-s的答案。


查看完整回答
反对 回复 2019-06-23
  • 3 回答
  • 0 关注
  • 405 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信