आप इसे सेड के साथ कर सकते हैं, हाँ, लेकिन अन्य टूल सरल हैं। उदाहरण के लिए:
$ 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 प्रिंट करता है।