Linux bash:根据变量将字符串重复n次

时间:2019-12-15 16:49:34

标签: bash variables indexing awk duplicates

我的数据集的每个名称有多种类型(用“,”分隔),我想以每行具有一种名称和一种类型的方式来复制名称。

数据集示例:

Name1    type1,type3
Name2    type2
Name3    type3,type4,type5

我的目标:

Name1   type1
Name1    type3
Name2    type2
Name3    type3
Name3    type4
Name3    type5

我试图在类型列中创建一个计算“,”数量的向量,然后使用该向量复制名称*“,”的数量,但这没有解决。我的计划是随后将两个向量粘贴在一起。

代码:

VAR1=$(cat file.txt | awk '{print $2}'| awk '{print gsub(",", "")}')

while IFS= read -r line; do counter=$((counter+1)); print $1 | perl -ne 'print "$_"x${VAR1[counter]}' <  file.txt

我认为问题在于VAR1的索引编制

感谢您的提前帮助,如果我的问题不清楚,很可能是因为这是我的第一篇帖子。

更新:

awk 'BEGIN{FS=","} {for(i=2;i<=NF;i++){print $1,$i}}' Input_file

导致:

Name1   type1
Name1    type1 type3
Name2    type2

目标:

Name1   type1
Name1    type3
Name2    type2

已解决! 在第一列中添加了“,”;如果可以的话,我会赞成您的解决方案x100,谢谢。

2 个答案:

答案 0 :(得分:1)

编辑: :尝试跟踪一次。

awk '{num=split($2,array,",");for(i=1;i<=num;i++){print $1,array[i]}}' Input_file


请您尝试以下。

awk -F'[[:space:],]+' '{for(i=2;i<=NF;i++){print $1,$i}}' Input_file

答案 1 :(得分:0)

这是GNU awk解决方案(标准Linux awk)。

script.awk

BEGIN {FS="[, \t]+";}
{
    for (i = 2; i <= NF; i++) print $1 "\t" $i;
}

input.txt

Name1  type1,type3
Name2   type2
Name3   type3,type4,type5

正在运行:

awk -f script.awk input.txt

或一支班轮:

awk 'BEGIN {FS="[, \t]+"}{for(i=2;i<=NF;i++) print $1 "\t" $i}' input.txt

输出:

Name1   type1
Name1   type3
Name2   type2
Name3   type3
Name3   type4
Name3   type5

解释:

BEGIN { # pre process
    FS = "[, \t]+"; # assign field separator "," or " " or "\t"
}
{ # for every line
    for (i = 2; i <= NF; i++) { # starting from 2nd field to last field
        print $1 "\t" $i; # print 1st field appended with tab and current field
    }
}