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 ( NF
là 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ó -a
làm cho perl
hành vi như awk
và 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 ( $#F
là 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.