我有一个如下所示的文件:
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 或类似方法来完成吗?
perl -ae 'my $num = shift @F; for (@F) {print "$num $_\n"}'
-a
是启用自动拆分模式。这会将每一行拆分为数组@F。
还有一些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'
使用 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
这可能对您有用(GNU sed):
sed -E 's/^((\S+) \S+) /\1\n\2 /;P;D' file
用换行符替换第二个空格,一行中的第一个值和一个空格。打印/删除第一行并重复。