आप इसे सेड के साथ कर सकते हैं, हाँ, लेकिन अन्य टूल सरल हैं। उदाहरण के लिए:
$ 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 "" : यह सिर्फ एक अंतिम newline प्रिंट करता है।
या पर्ल:
$ 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], दूसरा $F[1]आदि।
print "$F[1] " : दूसरा फ़ील्ड प्रिंट करें।
print "$F[0]:$_:1 " for @F[2..$#F];: फ़ील्ड 3 से अंतिम फ़ील्ड पर है ( $#Fसरणी में तत्वों की संख्या है @F, इसलिए @F[2..$#F]सरणी के अंत तक 3 तत्व से शुरू होने वाला एक सरणी टुकड़ा लेता है) और 1 फ़ील्ड को प्रिंट करें, ए :, और फिर वर्तमान फ़ील्ड और एक :1।
print "\n" : यह सिर्फ एक अंतिम newline प्रिंट करता है।