Bash 将单个逗号分隔的列转换为多行字符串

Bash turning single comma-separated column into multi-line string

在我的输入文件中,列以制表符分隔,每列中的值以逗号分隔。

我想打印第一列,第二列的每个逗号分隔值。

Mary,Tom,David   cat,dog
Kevin   bird,rabbit
John    cat,bird
...

for each record in the second column ( eg cat,dog ) i want to split record into array of [ cat, dog ] and cross print this against the first column. giving output ( just for this line )

Mary,Tom,David   cat
Mary,Tom,David   dog

整个文件的输出应该是:

Mary,Tom,David   cat
Mary,Tom,David   dog
Kevin   bird
Kevin   rabbit
John    cat
John    bird
...

如果我想使用 awk 或 sed,有什么建议吗? 谢谢

process.sh

#!/bin/bash

while read col_one col_two; do
  IFS=, read -a explode <<< "$col_two";
  for val in "${explode[@]}"; do
    printf "%s\t%s\n" "$col_one" "$val";
  done;
done <"";

和 input.txt 一样

Mary,Tom,David   cat,dog
Kevin   bird,rabbit
John    cat,bird

输出

$ ./process.sh input.txt 
Mary,Tom,David  cat
Mary,Tom,David  dog
Kevin   bird
Kevin   rabbit
John    cat
John    bird

用awk

awk '{split(,a,",");for(i in a)print "\t"a[i]}' file

用逗号拆分第二列,然后对于每个拆分值,打印第一列和该值

也在 sed 中

sed ':1;s/\(\([^\n]*\t\)[^\n]*\),\{1,\}/\n/;t1' file

使用 awk

awk '{split(, aEl, ","); for (Eli in aEl) print  "\t" aEl[ Eli]}' YourFile

使用 sed

sed 'H;s/.*//;x
:cycle
   s/\(\n\)\([^[:cntrl:]]*[[:blank:]]\{1,\}\)\([^[:cntrl:]]*\),\([^,]*\)//;t cycle
s/.//' YourFile

这可能对你有用 (GNU sed):

sed -r 's/^((\S+\s+)[^,]+),/\n/;P;D' file

该过程可以分解为三个命令:替换、打印和删除。用换行符和第一个字段以及随后的 space 替换第二个字段中的每个 ,。然后打印直到并包括换行符并删除直到并包括换行符并重复。关键命令是 D,它将重新调用之前的命令,直到模式 space 完全为空。