将逗号分隔的单元格(变化的条目)分隔为新行

问题描述 投票:2回答:6

我有.txt文件(制表符分隔)有两列。第一列用逗号分隔多个值。输入格式

a,b,c x
a     y
c,d,e z

期望的输出是

a x
b x
c x
a y
c z
d z
e z

逗号分隔条目的数量在1-40之间变化。我尝试了下面的awk命令,但只有在第一列中有两个逗号分隔的条目时它才有效:

awk 'BEGIN{FS="[       ,]"} {print $1, $NF; print $2, $NF}' input

如何修改可以完成工作的上述命令(或任何新命令)。谢谢。

shell awk sed
6个回答
3
投票

另一个awk

$ awk -F',| +' '{for(i=1;i<NF;i++) print $i,$NF}' 

将字段分隔符设置为空格或逗号,使用最后一个字段打印所有字段对(直到最后一个字段)。


2
投票

Perl救援!

perl -lane 'print "$F[0] $_ $F[2]" for glob "{$F[1]}"' file
  • -n逐行读取输入
  • -l从输入中删除换行符并将其添加到打印件中
  • -a将空白上的每一行拆分为@F数组
  • 与shell一样,glob在大括号中扩展逗号分隔列表

更新:您更改了规范(未标记任何更新)。解决方案仍然类似,只需使用

perl -lane 'print "$_ $F[1]" for glob "{$F[0]}"' file

1
投票

awk的split功能救援:

awk '{split($1,arr,","); for (key in arr) { print arr[key],$2 }}' input

1
投票
BEGIN {
    FS = "\t"
}

NF == 2 {
    n = split($1, a, ",")
    for (i = 1; i <= n; i++) {
        print a[i], $2
    }
}

0
投票

这可能适合你(GNU sed):

sed -r 's/\s+(\S+)$/ \1/;s/,(.*( \S+))$/\2\n\1/;P;D' file

从当前行中删除多余的空格。将每个,替换为空格,后跟当前行的最后一个字段,后跟换行符。打印当前行中的第一行,删除第一行并重复。


0
投票

你也可以使用这个sed

sed -E ':A;s/([^,]*),(.*)(\t.*$)/\1\3\n\2\3/;tA' infile

您将输出选项卡分开。

如果您不想要此标签:

sed -E ':A;s/([^,]*),(.*)(\t.*$)/\1\3\n\2\3/;tA;s/\t/ /g' infile
© www.soinside.com 2019 - 2024. All rights reserved.