在我的输入文件中,列以制表符分隔,每列中的值以逗号分隔。
我想用第二列的每个逗号分隔值打印第一列。
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? 感谢
答案 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