Bạn có thể làm điều đó với sed, vâng, nhưng các công cụ khác đơn giản hơn. Ví dụ:
$ awk '{
        printf "%s ", $2; 
        for(i=3;i<=NF;i++){
            printf "%s:%s:1 ",$1,$(i) 
        }
        print ""
       }' file 
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1 
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1 
Giải trình
awk sẽ chia mỗi dòng đầu vào khoảng trắng (theo mặc định), tiết kiệm từng lĩnh vực như $1, $2, $N. Vì thế:
- printf "%s ", $2;sẽ in trường thứ 2 và dấu cách.
- for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }: sẽ lặp lại các trường 3 đến trường cuối cùng (- NFlà số lượng các trường) và với mỗi trường, nó sẽ in trường thứ 1, a- :, sau đó là trường hiện tại và a- :1.
- print "": điều này chỉ in một dòng mới cuối cùng.
Hoặc Perl:
$ perl -ane 'print "$F[1] "; print "$F[0]:$_:1 " for @F[2..$#F]; print "\n"' file 
0 565:10:1 565:12:1 565:23:1 565:18:1 565:17:1 565:25:1 
1 564:7:1 564:12:1 564:13:1 564:16:1 564:18:1 564:40:1 564:29:1 564:15:1 
Giải trình
Nó -alàm cho perlhành vi như awkvà phân chia đầu vào của nó trên khoảng trắng. Ở đây, các trường được lưu trữ trong mảng @F, có nghĩa là trường thứ 1 sẽ là $F[0], thứ 2, $F[1]v.v.
- print "$F[1] ": in trường thứ 2.
- print "$F[0]:$_:1 " for @F[2..$#F];: lặp qua các trường 3 đến trường cuối cùng (- $#Flà số phần tử trong mảng- @F, do đó,- @F[2..$#F]lấy một lát mảng bắt đầu từ phần tử thứ 3 cho đến hết mảng) và in trường thứ 1, a- :, sau đó là trường hiện tại và a- :1.
- print "\n": điều này chỉ in một dòng mới cuối cùng.