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 完全为空。
在我的输入文件中,列以制表符分隔,每列中的值以逗号分隔。
我想打印第一列,第二列的每个逗号分隔值。
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 完全为空。