com o awk
awk '{$0=$0","NR}1' data1
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.
com o awk
awk '{$0=$0","NR}1' data1
Assumindo um arquivo POSIX, echo "$(head -c-1 data1)","$(wc -l <data1)"
produzirá o que você deseja. head
remove a nova linha à direita.
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.
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 -
.
Tags shell-script