我的数据集的每个名称有多种类型(用“,”分隔),我想以每行具有一种名称和一种类型的方式来复制名称。
数据集示例:
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,谢谢。
答案 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
)。
BEGIN {FS="[, \t]+";}
{
for (i = 2; i <= NF; i++) print $1 "\t" $i;
}
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
}
}