awk帮助将半csv文件修改为新格式

时间:2013-08-20 14:49:25

标签: perl sed awk

我遇到了一个小问题而无法解决问题,

我有一个文件,其中包含以下几行:

fig|1671.3.peg.2935,fig|1671.3.peg.2936,fig|1671.3.peg.29370 operon1

我想要这样的事情:

fig|1671.3.peg.2935    operon1
fig|1671.3.peg.2936    operon1
fig|1671.3.peg.29370    operon1

该文件没有固定数量的逗号分隔元素,在本例中为3,其他情况有时为1到8。

提前致谢。 CS

5 个答案:

答案 0 :(得分:3)

使用此:

awk -F'[, ]' '{for(i=1;i<NF;i++) {print $i,$NF}}' <filename>

您可以将正则表达式指定为分隔符。 -F '[, ]告诉awk,,(空格)可以是分隔符。其余的很明显。 NF是字段数,$NF是最后一个字段。

答案 1 :(得分:2)

基于Ed Morton's recommendation about split

$ awk '{split($1, a, ","); for (i in a) {print a[i], $2}}' file
fig|1671.3.peg.2935 operon1
fig|1671.3.peg.2936 operon1
fig|1671.3.peg.29370 operon1

解释

  • split($1, a, ",")根据逗号分割字符串。因此,将创建一个数组a[]
  • {for (i in a) {print a[i], $2}}遍历数组,打印输入文件的元素+第二个字段。

请注意,它适用于任意数量的逗号分隔字段:

$ cat file
hello,how,are,you good!
$ awk '{split($1, a, ","); for (i in a) {print a[i], $2}}' file
hello good!
how good!
are good!
you good!

答案 2 :(得分:2)

此脚本应该按您的要求执行:

$ awk -F '[, ]+' '{for (i=1;i<NF;i++) print $i, $NF}' file
fig|1671.3.peg.2935 operon1
fig|1671.3.peg.2936 operon1
fig|1671.3.peg.29370 operon1

答案 3 :(得分:2)

这可能适合你(GNU sed):

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

在每一行上用空格替换,,然后用行后面的最后一个字符串替换换行符和行的其余部分。打印然后删除最多并包括引入的换行符并重复,直到找不到,为止。

答案 4 :(得分:1)

awk版本,没有循环。

awk '{gsub(/,/," "$2"\n")}1' file
fig|1671.3.peg.2935 operon1
fig|1671.3.peg.2936 operon1
fig|1671.3.peg.29370 operon1