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

时间:2017-12-19 23:11:00

标签: shell awk sed

我有两列的.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

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

6 个答案:

答案 0 :(得分:3)

另一个<table> <tr> <td colspan="2"><label for="getTheKeys">Enter the key string: </label><input type="text" id="getTheKeys" value="abcdefghijklmnopqrstuvwxyz0123456789+-" size="53"/></td> <tr> <tr> <td><label for="encrypt">Encrypt: </label><input type="text" id="encrypt" value="" placeholder="Enter a number"/></td> <td class="giveMeSomeSpace"><label for="encrypted">Encrypted: </label><input type="text" id="encrypted" value="" readonly="readonly" /></td> <tr> <tr> <td><label for="decrypt">Decrypt: </label><input type="text" id="decrypt" value="" placeholder="Enter a key combination"/></td> <td class="giveMeSomeSpace"><label for="decrypted">Decrypted: </label><input type="text" id="decrypted" value="" readonly="readonly" /></td> <tr> </table> <input type="button" id="checkNow" value="Go" onclick="encryptDecrypt();" />

awk

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

答案 1 :(得分:2)

Perl救援!

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

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

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

答案 2 :(得分:1)

awk的split救援功能:

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

答案 3 :(得分:1)

BEGIN {
    FS = "\t"
}

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

答案 4 :(得分:0)

这可能适合你(GNU sed):

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

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

答案 5 :(得分: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