我有一个像这样的制表符分隔文件:
211845 032
215979 002 071
217783 143 156 169
219750 111
对于具有多个制表符分隔条目的行,我想根据第一列的值添加新行。这是我想要的结果:
211845 032
215979 002
215979 071
217783 143
217783 156
217783 169
219750 111
感谢任何想法,这个让我难住了。
答案1
使用awk
,对每行第一个字段之后的字段进行循环,并为每个字段打印一个新行。
awk -F'\t' -v OFS='\t' '{for (i=2;i<=NF;i++) print $1,$i}' file
输出:
211845 032
215979 002
215979 071
217783 143
217783 156
217783 169
219750 111
这样,我们就可以丢弃任何空白行或只有一个字段的行,这可能就是您想要的。为了保持它们原样,可以进行修改:
awk -F'\t' -v OFS='\t' 'NF<2 {print; next} {for (i=2;i<=NF;i++) print $1,$i}' file
答案2
GNU sed
您可以使用其扩展正则表达式模式-E
来帮助编写易于阅读的正则表达式来完成此操作。
sed -E '
s/\t/\n/2;T
s/^([^\t]+\t).*\n/&\1/
P;D
' file
输出:
211845 032
215979 002
215979 071
217783 143
217783 156
217783 169
219750 111
- 如果一行的制表符少于 2 个,则通过 T 命令将其原样显示。
- 用P命令显示第一对,将第一个字段缝合在第一对的后面。
- 这个过程一直持续到我们留下一个选项卡,然后通过第一步打印该选项卡。