1

我被一个小问题困住了,无法解决问题,

我有一个文件,其中有几行是这样的:

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

4

5 回答 5

3

用这个:

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

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

于 2013-08-20T14:57:11.650 回答
2

基于Ed Morton 关于 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}}循环通过数组打印输入文件的元素 + 2nd 字段。

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

$ 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!
于 2013-08-20T14:52:52.253 回答
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
于 2013-08-20T14:55:33.203 回答
2

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

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

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

于 2013-08-20T16:03:22.317 回答
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
于 2013-08-20T21:06:23.167 回答