我的输入数据有 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
不可用。POSIX
lhs
rhs
s///
结果
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