在 Unix 中转换行中未定义数量的列
Convert an undefined number of columns in rows in Unix
我有一个如下所示的文件:
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.
使用 Awk:
awk '{ for (i = 2; i <= NF; i++) print , $i }' input.txt
这基本上意味着“对于每一行,对于每个非初始字段,打印 第一个字段 (</code>) 和那个字段 (<code>$i
).
输出:
1 genA
1 genB
2 genC
2 genA
2 genS
2 genY
3 genM
3 genC
3 genF
更多 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'
这可能对你有用 (GNU sed):
sed -E 's/^((\S+) \S+) /\n /;P;D' file
用换行符、一行中的第一个值和 space 替换第二个 space。 Print/delete 第一行并重复。
我有一个如下所示的文件:
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.
使用 Awk:
awk '{ for (i = 2; i <= NF; i++) print , $i }' input.txt
这基本上意味着“对于每一行,对于每个非初始字段,打印 第一个字段 (</code>) 和那个字段 (<code>$i
).
输出:
1 genA
1 genB
2 genC
2 genA
2 genS
2 genY
3 genM
3 genC
3 genF
更多 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'
这可能对你有用 (GNU sed):
sed -E 's/^((\S+) \S+) /\n /;P;D' file
用换行符、一行中的第一个值和 space 替换第二个 space。 Print/delete 第一行并重复。