Solaris usando o gerador de sequência no início de cada nova linha

2

Eu criei um script que extrai dados de um banco de dados e os carrega em um arquivo csv. Estou usando o sistema SunOS hstz1454 5.10 . Eu estou tentando fazer uma sequência no começo de cada linha seguindo com uma comunicação.

Os dados são assim:

1,1,1535,0,1,Y,Y
1,1,1535,10,2,Y,Y
1,1,1535,20,1,Y,Y
1,1,1535,30,2,Y,Y
1,1,1535,40,1,Y,Y

Eu quero que meu arquivo csv gere um número de seqüência no começo de cada linha seguido por uma vírgula:

1,1,1,1535,0,1,Y,Y
2,1,1,1535,10,2,Y,Y
3,1,1,1535,20,1,Y,Y
4,1,1,1535,30,2,Y,Y
5,1,1,1535,40,1,Y,Y

Aqui está o meu código imprime apenas 1 e não incrementa, como posso incrementar cada nova linha?

for fname in conv2016_02_cos_speed2percent_data_migration.csv
do
  echo "adds a seq number on each line for $fname"
  sed 's/.*/1,&/' $fname > tmp.tmp 
  mv tmp.tmp $fname
done
    
por yesco1 16.12.2015 / 22:37

2 respostas

10

Use nl :

nl -s, -w1 file

Isso adicionará um número incremental ao início de cada linha. -s, especifica que o número e o resto da linha devem ser separados por uma vírgula. -w1 especifica o número de caracteres a serem usados para o número da linha.

Editar : Como Stéphane Chazelas apontou em o comentário , a flag -w1 reduz os números com mais de 1 dígitos. Isso pode ser um bug na implementação do nl do Solaris. Além disso, você pode querer numerar o conteúdo de linha especial ( -d $'\n\n' ) e as linhas emtpy (-ba):

NL='
'
nl -s, -ba -d "$NL$NL" file

A saída (com GNU coreutils 8.12.197 ):

$ nl -s, -ba -d "$NL$NL" file
     1,4,2,64,1088,80,1,Y,Y
     2,5,2,64,1088,95,2,Y,Y
     3,8,2,1088,39813120,10,12,Y,Y
     4,6,2,1088,39813120,0,2,Y,Y
     5,7,2,1088,39813120,5,1,Y,Y
     6,8,2,1088,39813120,10,2,Y,Y

No seu script, seria assim:

NL='
'
for fname in conv2016_02_cos_speed2percent_data_migration.csv; do
  nl -s, -ba -d "$NL$NL" "$fname"  > tmp.tmp && mv tmp.tmp "$fname"
done
    
por 16.12.2015 / 22:45
8

Aqui está uma maneira com o awk:

awk -v OFS=, '{print NR, $0}' < "$fname" > tmp && mv -- tmp "$fname"

e gato com sed

cat -n < "$fname" |
sed 's/^[[:blank:]]*\([[:digit:]]*\)[[:blank:]]*/,/' > tmp &&
mv -- tmp "$fname"

No Solaris, use /usr/xpg4/bin/sed|awk (ou command -p sed|awk se estiver usando um shell POSIX ou adapte $PATH para obter um ambiente padrão, conforme detalhado em standards(5) ).

    
por 16.12.2015 / 22:44