Możesz to zrobić za pomocą sed, tak, ale inne narzędzia są prostsze. Na przykład:
$ 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
Wyjaśnienie
awk będzie podzielić każdą linię wejścia na białych znaków (domyślnie), oszczędzając każdy pól jako $1
, $2
, $N
. Więc:
printf "%s ", $2;
wydrukuje drugie pole i końcowe miejsce.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: przejdzie przez pola 3 do ostatniego pola ( NF
jest liczbą pól) i dla każdego z nich wydrukuje 1. pole, a :
następnie bieżące pole i a :1
.
print ""
: to po prostu drukuje ostatnią nową linię.
Lub 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
Wyjaśnienie
Te -a
marki perl
zachowują się jak awk
i podzielić swoje wejście na spacji. Tutaj pola są przechowywane w tablicy @F
, co oznacza, że 1. pole będzie $F[0]
2., $F[1]
itd. Tak więc:
print "$F[1] "
: wydrukuj drugie pole.
print "$F[0]:$_:1 " for @F[2..$#F];
: iteruj po polach 3 do ostatniego pola ( $#F
jest liczbą elementów w tablicy @F
, więc @F[2..$#F]
bierze wycinek tablicy zaczynając od trzeciego elementu do końca tablicy) i wypisz pierwsze pole, a :
następnie bieżące pole i a :1
.
print "\n"
: to po prostu drukuje ostatnią nową linię.
Z awk:
lub z bash:
Wynik:
źródło
Cóż, możesz to zrobić w sed, ale python również działa.
Treści
reformatfile.py
są następujące:Jak to działa? Tak naprawdę nie dzieje się nic specjalnego. Otwieramy pierwszy argument wiersza poleceń jako plik do odczytu i przystępujemy do podziału każdego wiersza na „słowa” lub poszczególne elementy. Pierwsze słowa stają się
pref
zmienne, a my drukujemy na stdout drugim (słowa [1]) elemencie kończącym się spacją. Następnie konstruujemy nowy zestaw „słów” poprzez rozumienie listy i.join()
funkcję na tymczasowej liście pref, każdego słowa i łańcucha"1"
. Ostatnim krokiem jest wydrukowanie ichźródło
Z
awk
:Chodzi o formatowanie pól oddzielonych spacją w pożądanym formacie:
printf("%s ", $2)
drukuje drugie pole z końcową spacjąfor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)
iteruje od ostatniego do trzeciego pola i drukuje pola w pożądanym formacie (pierwsze pole, następnie dwukropek, następnie bieżące pole, następnie dwukropek, na końcu 1) z końcową spacjąprintf("%s:%s:1\n", $1, $NF)
wypisuje ostatnie pole z nową liniąPrzykład:
źródło