Bunu sed ile yapabilirsiniz, evet, ancak diğer araçlar daha basittir. Örneğin:
$ 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
açıklama
awk olarak her alanlar tasarrufu (varsayılan olarak) boşluk üzerinde girişin her satırı bölecek $1
, $2
, $N
. Yani:
printf "%s ", $2;
2. alanı ve sondaki alanı yazdırır.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: alanlar 3 üzerinden son alana ( NF
alan sayısıdır) yinelenir ve her biri için 1. alanı, a :
, ardından geçerli alanı ve a'yı yazdırır :1
.
print ""
: bu sadece son bir satırsonu yazdırır.
Veya 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çıklama
-a
Markaları perl
gibi davranır awk
ve boşluk üzerindeki girişini bölün. Burada, alanlar dizide saklanır @F
, yani 1. alan $F[0]
, 2. $F[1]
vb.
print "$F[1] "
: 2. alanı yazdırın.
print "$F[0]:$_:1 " for @F[2..$#F];
: alan 3'ü son alana yineleyin ( $#F
dizideki öğelerin sayısıdır @F
, bu nedenle @F[2..$#F]
dizinin sonuna kadar 3. öğeden başlayarak bir dizi dilimi alır) ve 1. alanı, a :
, ardından geçerli alanı ve bir :1
.
print "\n"
: bu sadece son bir satırsonu yazdırır.