-1

我有一个如下所示的文件:

1 genA genB
2 genC genA genS genY
3 genM genC genF
...

我想有以下输出:

1 genA
1 genB
2 genC
2 genA
2 genS
2 genY
3 genM
3 genC
3 genF
...

有什么方法可以在 unix 中使用 awk、sed 或类似方法来完成吗?

4

4 回答 4

5
perl -ae 'my $num = shift @F; for (@F) {print "$num $_\n"}'

-a是启用自动拆分模式。这会将每一行拆分为数组@F。

于 2021-06-01T03:25:49.410 回答
5

还有一些perl选择:

perl -lane 'print "$F[0] $_" for @F[1..$#F]'

# assuming digits can occur only in the first column
perl -lape 's/(?<!\d) /\n$F[0] /g'
于 2021-06-01T04:51:35.350 回答
3

使用 awk:

awk '{ for (i = 2; i <= NF; i++) print $1, $i }' input.txt

这基本上意味着“对于每一行,对于每个非初始字段,打印第一个字段 ( $1) 和该字段 ( $i)

输出:

1 genA
1 genB
2 genC
2 genA
2 genS
2 genY
3 genM
3 genC
3 genF
于 2021-06-01T03:31:16.627 回答
1

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

sed -E 's/^((\S+) \S+) /\1\n\2 /;P;D' file

用换行符替换第二个空格,一行中的第一个值和一个空格。打印/删除第一行并重复。

于 2021-06-01T08:55:12.127 回答