请帮我弄清楚如何使用来解决这个问题sed
。
鉴于以下文本:
喀拉拉邦 4222 8129 8163 8164 德里 8502 8503 8504 8505 果阿 1 39 45
我想将其转换为以下格式:
喀拉拉邦,4222 喀拉拉邦,8129 喀拉拉邦,8163 德里,8502 德里,8503 德里,8504 德里,8505 果阿,1 果阿,39 果阿,45
答案1
假设你的文件名称为test1
整个命令如下所示(一行):
names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g") && names2=(${names//;/ }) && for var in "${names2[@]}"; do numbers=$(cat test1 | sed -n "/$var/{n;p}" | sed "s/\s/;/g"); numbers2=(${numbers//;/ }); for num in "${numbers2[@]}"; do echo "$var,$num"; done; done
为了获得更好的视图,请查看此脚本:
names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")
names2=(${names//;/ })
for var in "${names2[@]}"; do
numbers=$(cat test1 | sed -n "/$var/{n;p}" | sed "s/\s/;/g")
numbers2=(${numbers//;/ })
for num in "${numbers2[@]}"; do
echo "$var,$num"
done
done
现在我想描述命令的所有部分
命令描述
该命令names=$(cat test1 | sed -n "/[a-zA-Z]/p" | sed "s/$/;/g")
为我提供了一个用分号分隔的名称列表,在您的情况下Kerala;Delhi;Goa
。我希望它们以这种形式出现,因为现在我可以使用第二个命令将它们更改为数组names2=(${names//;/ })
。现在我遍历所有名称,这是通过第一个for
循环完成的。
该命令numbers=$(cat test1 | sed -n "/$var/{n;p}" |sed "s/\s/;/g");
为我提供了当前变量的数字$var
。即,Kerala
这将是4222;8129;8163;8164
。行为与第一个命令相同:我想将它们更改为数组,以便可以遍历它们,这可以通过下一个命令完成numbers2=(${numbers//;/ });
。现在我遍历数字并将它们打印到屏幕上
for num in "${numbers2[@]}"; do echo "$var,$num"; done
我希望这是可以理解的。