Estou tentando converter um arquivo de texto em uma planilha separada por tabulação. Meu arquivo de texto é algo como isto:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
Com as funções de pesquisa e substituição padrão no Gedit ou no LibreOffice, é fácil substituir o final da linha por uma guia. Mas se eu apenas trocar retornos de carro por abas, vou receber o seguinte:
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
Mas o que eu preciso fazer é que fique assim:
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
Então, posso trocar todos os caracteres de fim de linha por uma guia, exceto a cada quarta linha?
Não sei se esse tipo de iteração condicional pode ser feita com expressões regulares dentro de um programa como o Gedit ou o LibreOffice, então talvez isso precise ser algum tipo de função de linha de comando? Nem sei ao certo qual é a melhor ferramenta para começar.
Atualizar:
Eu tentei os seguintes comandos:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
Mas quando tento abrir o tsv
arquivo resultante no LibreOffice, as colunas não estão certas. Não tenho certeza se isso significa que não estou executando os comandos acima corretamente ou se estou fazendo algo errado na função de importação do LibreOffice:
Apenas para referência, o resultado desejado deve ser assim:
fonte
dos2unix
eunix2dos
.Você pode usar
xargs
sempre para agrupar quatro linhas em uma, separadas com um único espaço cada:-d '\n'
define o delimitador de entrada como um caractere de nova linha, caso contrário, também seria interrompido nos espaços. Se você tiver apenas uma palavra por linha de entrada, poderá omitir isso.-n4
define o número do argumento (o número de itens de entrada por linha de saída) como 4.Resultado:
Ou, se você quiser guias como separadores em vez de um espaço, poderá substituí-las posteriormente. No entanto, se você tivesse espaços em suas linhas de entrada, eles também seriam substituídos:
Saída (aparência dependendo da largura da guia do navegador / terminal):
fonte
Você também pode usar:
As duas variáveis internas do awk são:
ORS
: O utput R ecord S eparator (padrão = nova linha). É adicionado no final de cada comando de impressão.NR
: N úmero da corrente de R ow awk está a processar.Este comando, para cada linha, exibirá o conteúdo da primeira coluna (e somente aqui). Em seguida, escolha adicionar uma nova linha ou uma guia testando o restante da divisão de
NR
por 4.fonte
Outra
awk
abordagem mais curta :Este printf a apenas uma coluna seguido pelo próximo e no próximo e ... e um Tab
\t
personagem depois de cada, mas vai printf um\n
caráter ewline quando N úmero de R ecord foi fator de 4 (ondeNR%4
retornará 0 (false) que é o Operador Ternáriocondition(s)?when-true:when-false
está fazendo.)fonte
Minha solução para isso seria usar a combinação de
sed
esed
. Primeiro, você pode marcar cada quarta linha com algum caractere especial, por exemplo>
, usando esta solução:Nesse caso, você deseja começar da linha 5 e marcar a cada quarta linha depois dela. No GNU
sed
isso pode ser dado como um endereço5~4
. Você pode usar este comando:Então você precisa remover as novas linhas, o que pode ser feito com um
sed
loop:Existem maneiras mais fáceis de converter novas linhas em outro caractere, por exemplo, com
tr
:De qualquer maneira, combinar os dois dá
(a
sed
versão deixa uma nova linha à direita, enquanto atr
versão não)Depois disso, você só precisa converter os caracteres especiais inseridos em novas linhas; veja, por exemplo, Converter um arquivo delimitado por tabulação para usar novas linhas . Nesse caso, altere
>
para novas linhas:O
y
comando executa a mesma função quetr
, transformando um caractere em outro, mas você pode usar os
comando aqui igualmente bem. Coms
, você precisag
operar em cada partida da linha (sed 's/>/\n/g'
).Em vez de criar dois arquivos intermediários, você pode usar pipes:
Se os espaços à direita forem um problema, você poderá adicionar outro comando para removê-los:
fonte
Por uma questão de "integridade", aqui está uma solução pura do bash:
Funciona também com espaços, supondo que
IFS
esteja definido corretamente (o que deveria, por padrão, AFAIK). Além disso, acho que isso pode até ser um script de shell portátil e funcionar com qualquer shell compatível com POSIX.fonte
$'
'
forma de citação não é requerida pelo POSIX. Por exemplo, emdash
(que fornecesh
por padrão no Ubuntu), executandoprintf '%s\n' $'a\tb'
apenas saídas$a\tb
. Isso não significa que isso não seja útil; funciona na festança. No entanto, como em algumas das outras soluções postadas pelas pessoas, produz saída incompleta se o número de linhas de entrada não for múltiplo de quatro. Além disso, recomendo o usoread -r
, pois não há razão para pensar que a expansão de barras invertidas escape no arquivo de entrada seja desejada aqui.printf '%s\t%s\t%s\t%s\n' "$one" "$two" "$three" "$four"
Uma macro vim (gravada com q) pode aplicar sua operação e pular três linhas. Depois, basta executar essa macro n vezes.
por exemplo:
fonte
Como você pediu uma solução Gedit, algo como isto deve funcionar:
Encontrar:
Substituir com:
Verifique se a caixa de seleção para expressões regulares está marcada.
Como funciona:
A primeira etapa é encontrar uma série de caracteres da palavra, com \ w +, e capturar os resultados na variável \ 1, envolvendo parênteses em torno da expressão:
Em seguida, procuramos uma série de caracteres de final de linha, \ re \ n, ou CR e LF. Como os arquivos formatados do Windows usam os dois, criamos uma classe de caracteres colocando esses dois caracteres entre colchetes. O plus faz com que procure um ou mais caracteres:
Finalmente, repetimos isso mais três vezes, armazenando cada palavra subsequente nas variáveis \ 2, \ 3 e \ 4. Isso torna nossa substituição pela expressão simples. Nós apenas precisamos colocar caracteres de tabulação, \ t, e um novo caractere de linha, \ n, nos locais apropriados para a formatação necessária.
fonte