eu tenho um arquivo assim
Hello,Hi,Hullo,Hammers,Based,Random
Para n=2
, a saída deve ser assim
Hello,Hi
Hullo,Hammers
Based,Random
Para n=3
, a saída deve ser assim
Hello,Hi,Hullo
Hammers,Based,Random
Como eu poderia fazer isso usando awk/sed?
Editar: n
é um fator de número de campos
Na sua pergunta, você não abordou como lidar com casos em que o número de campos não se divide igualmente,
n
então também não abordei aqui.Outra abordagem com
tr
epaste
:Para n=2,
Para n=3,
Usando perl:
Isso usa o primeiro argumento como o número de entradas impressas por linha de saída (usando variável
$n
). STDIN e quaisquer argumentos de nome de arquivo são usados como entrada.Devido à
-F,
opção (que habilita implicitamente as opções-a
e-n
), ele lê automaticamente cada linha de entrada e a divide em vírgulas em array@F
, então itera sobre os índices do array,$n
itens por vez.$n
elementos são impressos em cada linha de saída.OBSERVAÇÃO: use o módulo Text::CSV se precisar analisar o CSV real com campos entre aspas e vírgulas incorporados em aspas em vez de uma entrada simples delimitada por vírgulas.
Saída com um argumento de
3
em vez de2
:E novamente com
4
:awk
novamente,insira qualquer conjunto de valores separados por
,
e novas linhas, produzaum csv de largura fixa:
Com
perl
:Esta pergunta me faz pensar em
python
zip/iter funções internas :Usando Raku (anteriormente conhecido como Perl_6)
Entrada de amostra:
Saída de amostra com
.rotor(3)
(de cima):Saída de amostra mudando acima para
.rotor(2)
:O código acima é uma implementação básica no Raku (retornando um único espaço em branco entre as colunas). A
rotor()
chamada determina o número de colunas [ veja a discussão abaixo sobre a diferença entrerotor()
ebatch()
]. Basta adicionar uma chamada para.join()
se quiser juntar colunas usando vírgulas, tabulações, barras verticais, etc.:Observe que, por padrão,
rotor()
retorna apenas grupos completos e descartará grupos parciais no final. Portanto, realizar umarotor(4)
chamada na amostra de seis elementos acima resultará em uma única linha de saída, com 4 elementos. Para garantir que não haja perda de dados, userotor(4, :partial)
oubatch(4)
.O processamento por um analisador CSV autêntico (por exemplo, o
Text::CSV
módulo Raku) validará o arquivo CSV resultante. Consulte o URL abaixo para obter exemplos.https://unix.stackexchange.com/a/701805/227738
https://raku.org
Usando
sed
Além da abordagem óbvia awk/Perl/sed, posso recomendar Miller
Ele pode extrair e modificar dados baseados em texto muito bem e é mais intuitivo de usar do que suas contrapartes.