Manipulação de lista usando sed / awk

2

Eu quero organizar a seguinte lista em formato específico

Atual:

42.53e-12
43.64e-12
45.78e-12
49.86e-12
57.87e-12
73.68e-12
105.3e-12

Necessário

"42.53e-12, 43.64e-12, 45.78e-12, 49.86e-12, 57.87e-12, 73.68e-12, 105.3e-12"

Todos os números separados por vírgulas e a lista entre aspas.

    
por cHiRaG 11.02.2018 / 19:33

6 respostas

2

Usando awk :

awk '{printf (NR>1)?", "$0:"\""$0} END {print "\""}' infile

Ou de outra forma:

awk '$1="\""$1' RS= ORS="\"\n" OFS=', ' infile

Ou com a combinação dos comandos echo e sed (supondo que não haja espaços em branco no seu arquivo em que a divisão de palavras da shell esteja acontecendo aqui)

sed 's/ /, /g' <(echo \"$(<infile)\")
    
por 11.02.2018 / 19:57
2
  1. Pure POSIX sh , (como não carrega nenhum programa externo, isso é mais rápido para arquivos pequenos, se dash for o shell atual):

    n='"'; while read x; do n="$n$x, "; done < file; echo ${n%,*}\"
    
  2. % purobash, (mais rápido para arquivos pequenos, se bash for o shell atual):

    n=$(<file); echo \"${n//
    /, }\"
    
  3. % purosed:

    sed -n 'H;${g;s/\n/, /g;s/, $//;s/, \(.*\)/""/p}' file
    
  4. Ferramentas da shell:

    /bin/echo -e \"$(xargs printf "%s, " < file)'\b\b"'
    
por 11.02.2018 / 20:12
1

Algumas abordagens para alcançar o objetivo:

Solução

paste + sed :

paste -d',' -s file | sed 's/,/, /g; s/^\|$/"/g'

python solução:

python -c 'import sys; print("\""+", ".join(i.strip() for i in sys.stdin)+"\"")' <file

A saída (para ambas as abordagens):

"42.53e-12, 43.64e-12, 45.78e-12, 49.86e-12, 57.87e-12, 73.68e-12, 105.3e-12"
    
por 11.02.2018 / 19:50
1

Usando o Perl (na entrada do arquivo list.txt ):

$ perl -e 'printf "\"%s\"\n", join ", ", map { chomp; $_ } <>' list.txt
"42.53e-12, 43.64e-12, 45.78e-12, 49.86e-12, 57.87e-12, 73.68e-12, 105.3e-12"

map é usado para aplicar chomp; $_ em cada linha de entrada. chomp removerá o caractere de nova linha e o $_ no final fará com que a linha modificada seja a saída de map para essa linha de entrada.

join associa (concatena) a matriz que map produziu, inserindo ,␣ (espaço de vírgula) entre cada elemento.

printf imprime a string concatenada com " no início e no final. A string é enviada com uma nova linha no final.

Variação usando print em vez de printf :

perl -e 'print "\"", (join ", ", map { chomp; $_  } <>), "\"\n"' list.txt
    
por 12.02.2018 / 21:43
0
awk 'BEGIN{ ORS=""; pre="\""}{print pre $0; pre=","}END{ORS="\n";print "\""}'
    
por 11.02.2018 / 20:10
0

Uma solução sed pura:

sed '${H;g;s/\n//g;b};s/^.*$/&, /;H;d' infile
    
por 11.02.2018 / 22:20