Quebrar um arquivo de strings, em arquivos separados, cada um baseado na primeira letra. BATER

4

Tudo bem, então eu tenho um arquivo cheio de milhares de strings. Cada um na sua própria linha. Eu quero fazer um script que me permita pegar este arquivo, chamá-lo de list.txt , e pegar os itens de cada linha, e colocá-lo em arquivos separados baseados na primeira letra ou número. Por exemplo, digamos que as primeiras linhas do arquivo são assim:

cheese
pizza
pepperoni
lettuce
grahamCrackers
0-0Foods
chicken
lentils
1-2Items

Eu preciso dividir isso em:

c.txt

cheese
chicken

g.txt

grahamCrackers

l.txt

lettuce
lentils

p.txt

pizza
pepperoni

0.txt

0-0Foods

1.txt

1-2Items

Eu gostaria de fazer isso com o BASH, no OS X. Obrigado.

Ah, se ajudar. Itens em cada linha nunca terão um espaço, eles sempre serão contidos como uma palavra. POR EXEMPLO. (Nunca canja de galinha, em vez de canja de galinha)

    
por Josiah 02.02.2013 / 18:57

3 respostas

4

Tente isso

OLDIFS=$IFS
IFS='
'
typeset -a file
file=($(cat list.txt))
for i in "${file[@]}"; do
    echo $i >> ${i:0:1}.txt
done
IFS=$OLDIFS

Note que a parte IFS geralmente não é necessária. Também testei no Zsh 4.3.17 no linux e no Bash 4.2.37.

O que ele faz é declarar uma matriz, atribui o conteúdo do arquivo a essa matriz e, em seguida, faz um loop sobre cada elemento da matriz, portanto cada linha e echo desse elemento no arquivo com o nome da primeira lettes plus ' .txt 'anexado a ele.

    
por 02.02.2013 / 19:10
5

Você pode usar o gawk e simplificar as coisas:

gawk '{n=substr($1,0,1); print >> n".txt"}' file.txt
  • n=substr($1,0,1) usa uma substring de comprimento 1 a partir da primeira posição (0) do primeiro campo ( $1 ) e salva-a em uma variável chamada n .

  • print >> n".txt" acrescentará ( >> ) cada linha em um arquivo de texto chamado n.txt (onde n é a primeira letra).

Para fazer o mesmo nas duas primeiras letras, basta alterar o tamanho de substr :

gawk '{n=substr($1,0,2); print >> n".txt"}' file.txt
    
por 02.02.2013 / 20:39
0
#!/bin/bash

while read line
do
    firstChar=${line:0:1}
    fileName=${firstChar}.txt
    if [ -e ${fileName} ];then
    touch ${fileName}
     fi
    echo ${line} >> ${fileName}
done < list.txt

O script acima pega o primeiro caractere de cada linha lida do arquivo list.txt . Em seguida, ele tenta criar um arquivo com esse caractere + ".txt" e, em seguida, anexar cada linha de list.txt ao caractere apropriado + arquivo ".txt".

    
por 03.02.2013 / 15:17