Anexa um arquivo ou comando no final da linha de outro arquivo

1

Estou tentando fazer isso há horas,

Eu tenho um arquivo com esses dados, vamos chamar de dados1:

test1,test2,test3

Eu quero adicionar uma contagem, junto com uma vírgula, ao final da linha desses dados. Vamos supor que estou contando o número de linhas de data1, que é uma linha.

echo ", $(wc -l < data1 | bc)"

Eu quero que minha saída seja:

test1,test2,test3,1

Eu tentei echo, printf, algum awk (eu ainda não entendo tudo isso), cat.

    
por Reginald Maravilla 01.03.2018 / 09:00

4 respostas

1

com o awk

awk '{$0=$0","NR}1' data1
    
por 01.03.2018 / 21:02
0

Assumindo um arquivo POSIX, echo "$(head -c-1 data1)","$(wc -l <data1)" produzirá o que você deseja. head remove a nova linha à direita.

    
por 01.03.2018 / 09:11
0

Use sed para anexar o número à última linha:

STRING='echo "$(wc -l < data1 | bc)"' && sed -i '$s/^\(.*\)$/,'"$STRING"'/' data1
$ cat data1 
test1,test2,test3,1

A primeira parte salva o número de linhas para a variável STRING e o sed pega a última linha e acrescenta o , e o conteúdo da variável $STRING ao final da linha.

    
por 01.03.2018 / 09:19
0

O comando paste é usado para adicionar colunas:

$ wc -l <data1 | paste -d, file -
test1,test2,test3,       1

Isso é literalmente o que você pediu; a saída de wc é adicionada ao final da linha do arquivo. A saída de wc tem espaço em branco no início da linha, e é por isso que você obtém o espaçamento que você obtém aqui.

Para remover este espaço em branco:

$ wc -l <data1 | sed 's/^ *//' | paste -d, file -
test1,test2,test3,1

O comando paste é usado aqui com -d, , o que faz com que ele insira uma vírgula entre as colunas antiga e nova. O - indica que as novas colunas devem ser lidas a partir da entrada padrão e não de um arquivo. A entrada padrão vem de wc -l , que conta o número de linhas no arquivo.

A variação com sed simplesmente pega a saída wc e remove qualquer caractere de espaço no início da linha.

Usando bash substituição de processo:

paste -d, file <( wc -l <data1 | sed 's/^ *//' )

Aqui, a substituição do processo, <( ... ) , substitui - .

    
por 01.03.2018 / 11:03