在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 回调