คุณสามารถทำได้ด้วย 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"
: แค่พิมพ์บรรทัดใหม่สุดท้ายขึ้นมา