คุณสามารถทำได้ด้วย sed, ใช่ แต่เครื่องมืออื่น ๆ นั้นง่ายกว่า ตัวอย่างเช่น:
$ 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
คำอธิบาย
awk จะแบ่งแต่ละบรรทัดของข้อมูลเกี่ยวกับช่องว่าง (ค่าเริ่มต้น) ประหยัดแต่ละสาขาเป็น$1, ,$2 $Nดังนั้น:
printf "%s ", $2; จะพิมพ์ฟิลด์ที่ 2 และพื้นที่ต่อท้าย
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }: จะย้ำกว่าเขต 3 ถึงสนามสุดท้าย ( NFคือจำนวนของเขตข้อมูล) และสำหรับแต่ละของพวกเขาจะพิมพ์เขต 1 เป็นแล้วเขตข้อมูลปัจจุบันและ::1
print "" : แค่พิมพ์บรรทัดใหม่สุดท้ายขึ้นมา
หรือ 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
คำอธิบาย
-aทำให้perlทำตัวเหมือนawkและแยกการป้อนข้อมูลของตนในช่องว่าง ที่นี่ฟิลด์จะถูกเก็บไว้ในอาร์เรย์@Fซึ่งหมายความว่าฟิลด์ที่ 1 จะเป็นฟิลด์$F[0]ที่ 2 $F[1]เป็นต้นดังนั้น:
print "$F[1] " : พิมพ์ฟิลด์ที่ 2
print "$F[0]:$_:1 " for @F[2..$#F];: วนซ้ำฟิลด์ 3 ไปยังฟิลด์สุดท้าย ( $#Fคือจำนวนองค์ประกอบในอาเร@Fย์ดังนั้น@F[2..$#F]จะใช้อาเรย์สไลซ์เริ่มต้นที่องค์ประกอบที่ 3 จนถึงจุดสิ้นสุดของอาเรย์) แล้วพิมพ์ฟิลด์ที่ 1 a :จากนั้นฟิลด์ปัจจุบันและ:1.
print "\n" : แค่พิมพ์บรรทัดใหม่สุดท้ายขึ้นมา