Combine a lista de palavras em uma linha e, em seguida, adicione caracteres

3

Eu quero pegar um arquivo que tenha uma lista de palavras em cada linha, por exemplo.

act
bat
cat
dog
eel

e colocá-los em uma linha com separados por vírgula e citando-os. Então, parece que:

'act', 'bat', 'cat', 'dog', 'eel',

então, uma aspa simples, depois a palavra, depois outra aspa simples, depois uma vírgula, depois um espaço. Em seguida, imprima em um novo arquivo com um novo nome.

    
por sh_newbie 22.10.2017 / 13:30

4 respostas

1

Usando awk :

awk '{printf ("'\'%s\'', ", $0)}' infile > new_file
'act', 'bat', 'cat', 'dog', 'eel',

Ou para evitar adicionar uma vírgula extra no final, use abaixo em vez disso.

awk '{printf S"'\''"$0"'\''";S=", "}'
'act', 'bat', 'cat', 'dog', 'eel'

Ou usando paste sem citar.

paste -d, -s infile
act,bat,cat,dog,eel

Em seguida, cite-o para ajudar sed :

sed -r "s/(\w+)/''/g" <(paste -d, -s infile)
'act','bat','cat','dog','eel'
    
por 22.10.2017 / 13:43
3

Abordagem curta printf :

printf "'%s', " $(< file) > output
    
por 22.10.2017 / 14:01
2

Usando sed e tr :

$ sed -e "s/^/'/" -e "s/$/', /" file | tr -d '\n'
'act', 'bat', 'cat', 'dog', 'eel',

(sem nova linha no final da saída)

O sed insere as aspas no início e no final de cada linha de entrada (e uma vírgula e espaço depois), enquanto tr remove as novas linhas.

Redirecionar a saída para um arquivo:

$ sed -e "s/^/'/" -e "s/$/', /" file | tr -d '\n' >newfile
    
por 22.10.2017 / 14:25
0

abordagem Perl:

$ perl -lne '$sq="\x27";push @a,$sq.$_.$sq;END{ print join( ",",@a) }' input.txt                                                                                                                                                           
'act','bat','cat','dog','eel'
  • aqui, usamos o valor hexadecimal para aspas simples armazenado na variável sq e, para cada linha lida do arquivo, nós a envolvemos em aspas simples
  • cada linha com aspas simples é enviada para a array
  • depois que tudo é lido, join cria uma única string de texto em cada item da matriz, unida por meio de ,

A abordagem em Python segue as mesmas linhas:

$ python -c 'import sys;sq="\x27";print ",".join([ sq + l.strip() + sq  for l in sys.stdin  ])' < input.txt                                                                                                                                 
'act','bat','cat','dog','eel'
  • aqui redirecionamos o arquivo de entrada para o fluxo stdin do comando via shell < operator
  • cada linha é removida do caractere de nova linha \n via método de faixa, citado pela mesma ideia descrita na abordagem Perl
  • todas as linhas são processadas em uma lista via [item for item in iterable] structure (conhecida como compreensão da lista)
  • e, finalmente, ",".join() nos permite criar uma string legal em todos os itens da lista
por 23.10.2017 / 07:49