Você poderia fazer isso com o sed, sim, mas outras ferramentas são mais simples. Por exemplo:
$ 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
Explicação
awk irá dividir cada linha de entrada no espaço em branco (por padrão), economizando cada campos como $1
, $2
, $N
. Então:
printf "%s ", $2;
imprimirá o segundo campo e um espaço à direita.
for(i=3;i<=NF;i++){ printf "%s:%s:1 ",$1,$(i) }
: iterará nos campos 3 até o último campo ( NF
é o número de campos) e, para cada um deles, imprimirá o 1º campo, a :
, o campo atual e a :1
.
print ""
: isso apenas imprime uma nova linha final.
Ou 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
Explicação
As -a
marcas perl
se comportam como awk
e dividem sua entrada no espaço em branco. Aqui, os campos são armazenados na matriz @F
, o que significa que o 1º campo será $F[0]
, o 2º $F[1]
etc. Então:
print "$F[1] "
: imprime o segundo campo.
print "$F[0]:$_:1 " for @F[2..$#F];
: repita os campos 3 até o último campo ( $#F
é o número de elementos na matriz @F
, portanto, @F[2..$#F]
pega uma fatia da matriz que começa no terceiro elemento até o final da matriz) e imprime o 1º campo, a :
, depois o campo atual e um :1
.
print "\n"
: isso apenas imprime uma nova linha final.
Com awk:
ou com bash:
Resultado:
fonte
Bem, você pode fazê-lo no sed, mas o python também funciona.
Os conteúdos do
reformatfile.py
são os seguintes:Como é que isso funciona? Não há realmente nada de especial acontecendo. Abrimos o primeiro argumento da linha de comando como arquivo para leitura e prosseguimos com a divisão de cada linha em "palavras" ou itens individuais. As primeiras palavras se tornam
pref
variáveis e imprimimos no segundo item stdout (palavras [1]) que termina com espaço. A seguir, construímos um novo conjunto de "palavras" por meio da compreensão da lista e.join()
funcionamos em uma lista temporária de pref, cada palavra e string"1"
. O passo final é imprimi-losfonte
Com
awk
:É tudo sobre formatação de campos separados por espaço no formato desejado:
printf("%s ", $2)
imprime o segundo campo com um espaço à direitafor(i=3; i<NF; i++) printf("%s:%s:1 ", $1, $i)
itera sobre o terceiro ao segundo último campo e imprime os campos no formato desejado (primeiro campo, depois dois pontos, depois o campo atual, depois dois pontos, finalmente 1) com um espaço à direitaprintf("%s:%s:1\n", $1, $NF)
imprime o último campo com nova linhaExemplo:
fonte