在Unix中转换行中未定义的列数[关闭]

Posted

技术标签:

【中文标题】在Unix中转换行中未定义的列数[关闭]【英文标题】:Convert an undefined number of columns in rows in Unix [closed] 【发布时间】:2021-08-19 06:24:15 【问题描述】:

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

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 或类似方法来完成吗?

【问题讨论】:

欢迎来到 Stack Overflow。 SO is a question and answer page for professional and enthusiast programmers。请在您的问题中添加您自己的代码。您应该至少展示自己为解决这个问题所做的研究。 【参考方案1】:
perl -ae 'my $num = shift @F; for (@F) print "$num $_\n"'

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

【讨论】:

【参考方案2】:

使用 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

【讨论】:

【参考方案3】:

更多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'

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于在Unix中转换行中未定义的列数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

处理神经网络中未定义的数据[关闭]

在cordova-2.0.0中未定义的window.plugins [关闭]

当设备重新启动并强制关闭应用程序时,Redmi 和其他自定义中文 ROM 中未收到 WorkManager doWork 回调

MATLAB Coder 函数在 2014a 中未定义

使用 webpack 在 ASP.NET Core 项目中未定义 jQuery 和 $

在 IE11 中未定义获取错误承诺