使用 sed 转置文本

使用 sed 转置文本

请帮我弄清楚如何使用来解决这个问题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

我希望这是可以理解的。

相关内容