如何将不同行中的第一列内容分开

如何将不同行中的第一列内容分开

我的输入数据有 5 列,由制表符分隔:

Class1,Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4,Class5 info1b info2b1,info2b2 info3b info4b

当我在第一列中用逗号分隔数据时,我想用第二至第五列中具有相同信息的不同行将其分隔,例如:

Class1 info1 info2 info3 info4
Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4 info1b info2b1,info2b2 info3b info4b
Class5 info1b info2b1,info2b2 info3b info4b

我不知道该怎么做。有什么建议吗?

答案1

awk解决方案:

awk '$1~/.+,.+/{ split($1,a,","); $1=""; sub(/^ */,"",$0); 
     for(i=1;i<=length(a);i++) print a[i],$0; next }1' file

输出:

Class1 info1 info2 info3 info4
Class2 info1 info2 info3 info4
Class3 info1a info2a info3a info4a
Class4 info1b info2b1,info2b2 info3b info4b
Class5 info1b info2b1,info2b2 info3b info4b

  • $1~/.+,.+/- 如果第一列包含逗号分隔的项目,则处理行
  • split($1,a,",")- 将第一列拆分为项目数组

答案2

perl -F'\t' -lane '$,="\t";
   print $_, @F for split /,/, splice @F, 0, 1;
' yourfile

结果

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b

答案3

POSIX sed

TAB=$(printf \\t) NL=$(printf \\nn | sed -e '$!s/$/\\/')
sed -e "s/^\([^,${TAB}]*\),\([^${TAB}]*\)\(.*\)/\1\3${NL%?}\2\3/;P;D" yourfile

我们首先定义在没有转义序列的情况下能够在双引号 sed 命令中使用的 TAB 和换行符变量,\t并且在 sed和sed 命令下分别\n不可用。POSIXlhsrhss///


结果

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b

相关内容