重复一行,分割一个字段

Ila*_*ino 3 awk perl text-processing

我有一个制表符分隔的文件,其中每一行都有:

K00001;K00004;K00008    0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0
Run Code Online (Sandbox Code Playgroud)

我想要一行具有唯一代码和相同的数字序列,如下所示:

K00001 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0    
K00004 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0    
K00008 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0
Run Code Online (Sandbox Code Playgroud)

fre*_*ini 7

您可以使用 awk 拆分第一列:

~$ awk '{split($1,a,";"); $1="";for (i in a){print a[i],$0}}' myfile
K00001  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
K00004  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
K00008  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
Run Code Online (Sandbox Code Playgroud)

您在;( split($1,a,";"))上拆分第一列,然后将其删除,以便$0为数组中的每个项目打印整个(新)行 ( )。


正如评论中所建议的,编辑后,我们可以看到使用制表符作为分隔符。要将 tab 用作输出字段分隔符,您可以使用OFS="\t",例如在BEGINawk的部分中。此外,插入一个空字段$1=""。因此,与其打印a[i]then $0,不如设置$1a[i]then 打印$0

~$ awk 'BEGIN{OFS="\t"}{split($1,a,";"); for (i in a){$1=a[i];print}}' myfile
K00001  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
K00004  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
K00008  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
Run Code Online (Sandbox Code Playgroud)

  • 你最好设置`OFS="\t"`,这样生成的文件与输入的格式相同。这可能会更好:`for (i in a) {$1 = i; print}` -- 不会为前一个 $1 插入空字段。 (2认同)