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

时间:2015-10-29 08:00:45

标签: bash awk sed multiple-columns comma

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

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

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

对于我要拆分的第二列中的每条记录(例如cat,dog)   记录到[猫,狗]的数组并交叉打印这个   第一栏。给出输出(仅适用于此行)

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? 感谢

4 个答案:

答案 0 :(得分:4)

使用awk

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

在逗号上拆分第二列,然后为每个拆分值打印第一列和该值

同样在sed

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

答案 1 :(得分:2)

这可能适合你(GNU sed):

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

该过程可以分为三个命令:替换,打印和删除。用换行符替换第二个字段中的每个,以及第一个字段和以下空格。然后打印到包含换行符并删除最多并包含换行符并重复。键命令是D,它将重新调用先前的命令,直到模式空间完全为空。

答案 2 :(得分:1)

<强> 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 <"$1";

将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

答案 3 :(得分:1)

使用awk

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

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