Gostaria que cada linha de um arquivo fosse repetida um número fixo de vezes.
por exemplo, repetir cada linha quatro vezes:
a
b
c
torna-se:
a
a
a
a
b
b
b
b
c
c
c
c
Eu fiz algumas pesquisas e há muitas perguntas e respostas ao longo das linhas para fazer o inverso, por exemplo, mesclar linhas duplicadas em linhas únicas e talvez algumas sobre duplicar linhas imprimindo-as novamente.
Seria fácil fazer isso em C, mas eu gostaria de saber mais sobre os comandos nativos para não precisar recorrer a esses tipos de brincadeiras pontuais o tempo todo.
text-processing
sed
awk
perl
Yimin Rong
fonte
fonte
awk
'sfor
não precisa de chaves, se houver apenas um comando para repetir. Eperl
é mais simples se você usar oforeach
loop:for$i(0..3){print}
.perl -ne 'print(($_)x4)'
. Além disso, você deve citar$line
(em eco) em sua versão do bash.BEGIN { ORS="\r\n" }
Gostaria de saber se isso está se transformando em uma partida de golfe :
Explicação:
O
p
comando do sed é imprimir a linha atual. O comportamento padrão é imprimir a linha atual imediatamente antes de passar para a próxima linha (é por isso que o sed precisa-n
permitir que você a desative). Alguns seds mais velhos não têm o ponto-e-vírgula (eu acho), então é possível que você precise fazersed -e p -e p -e p
O Awk trabalha com
condition {action}
pares. Se a ação for omitida, o padrão é imprimir a linha atual se a condição retornar verdadeira. O Awk, como muitos idiomas semelhantes a C, trata1
como verdade. (Para completar, se a condição for omitida, a ação será executada para cada registro.)Muitas funções perl aproveitam a variável "padrão". Este one-liner é equivalente a (no perl 5.16):
fonte
1
awk faz? Taquigrafia paraprint $0
?1
(true); o bloco padrão é equivalente a{print}
. Portanto, a instrução1
significaria imprimir o buffer de linha atual ({print}
). ({print}
E{print $0}
são praticamente os mesmos, qed.)sed
que não suporte ponto e vírgula como terminadores de comando; existe realmente uma coisa dessas?fonte
Você pode fazer isso sem a necessidade de
sed
,perl
ouawk
.ou usando um loop while:
Exemplos
para laço enquanto loopfonte
Usando puramente shell:
fonte
--help
como uma string em vez de uma opção? [considere o caso em queline
existe--help
ou outra opção]yes -- --help
yes
ehead
meios isto não é "puramente shell"Isso pode funcionar para você (GNU sed):
Repetirá cada linha 4 vezes.
Ou se você preferir:
Onde você repete cada linha mais três vezes.
fonte
A resposta do @potong não funciona com linhas vazias, substituindo
\+
por*
deve corrigi-lo:fonte