Question Briser un fichier de chaînes, en fichiers distincts, chacun basé sur la première lettre. FRAPPER


Bon, j'ai donc un fichier plein de milliers de chaînes. Chacun sur sa propre ligne. Je veux faire un script qui me permettra de prendre ce fichier, appelez-le list.txt, et prenez les éléments de chaque ligne et placez-les dans des fichiers séparés en fonction de la première lettre ou du premier chiffre. Par exemple, disons que les premières lignes du fichier sont comme suit:

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

J'ai besoin de le décomposer en ces:

c.txt

cheese
chicken

g.txt

grahamCrackers

l.txt

lettuce
lentils

p.txt

pizza
pepperoni

0.txt

0-0Foods

1.txt

1-2Items

Je voudrais accomplir cela avec BASH, sous OS X. Merci.

Oh, si ça aide. Les éléments de chaque ligne n'auront JAMAIS d'espace, ils seront toujours contenus en un seul mot. PAR EXEMPLE. (Jamais de soupe au poulet, au lieu de soupe au poulet)


4
2018-02-02 17:57


origine




Réponses:


Essaye ça

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

Notez que la partie IFS n'est généralement pas nécessaire. De plus, je l'ai testé sur Zsh 4.3.17 sous Linux et Bash 4.2.37.

Qu'est-ce qu'il fait, il déclare un tableau, assigne le contenu du fichier à ce tableau, puis boucle sur chaque élément du tableau, donc chaque ligne et echo 'cet élément dans le fichier avec le nom des premières lettes plus' .txt ' en annexe.


4
2018-02-02 18:10



Je viens d'essayer d'utiliser ce code exact et j'ai remplacé list.txt par mon fichier. Cependant, cela a pris du temps, mais après cela a été fait. Rien ne s'est passé. Étais-je censé faire autre chose? - Josiah
Non, ça marche pour moi hors de la boîte. Essayez 'set -x', puis exécutez la commande et collez la sortie, peut-être puis-je vous aider. - KoviRobi
Semble travailler maintenant. Merci. - Josiah
Oui, 'mkdir' ce dossier en premier, puis changez '$ {i: 0: 1} .txt' en 'dossier / $ {i: 0: 1} .txt' - KoviRobi
Whoa ... c'est beaucoup plus élégant que la solution basée sur grep / sed que j'allais écrire. C'est toujours surprenant ce que bash peut faire par lui-même. Cela dit, vous pouvez éviter de jouer avec $ IFS et simplifier les choses en utilisant une boucle while au lieu de la boucle. Remplacer for i in "${file[@]}"; do avec while read i; doet remplacer done avec done <list.txt, et alors vous pouvez laisser tomber toutes les choses en dehors de la boucle. - evilsoup


Vous pouvez simplement utiliser gawk et simplifier les choses:

gawk '{n=substr($1,0,1); print >> n".txt"}' file.txt
  • n=substr($1,0,1) prend une sous-chaîne de longueur 1 à partir de la première position (0) du premier champ ($1) et l'enregistre dans une variable appelée n.

  • print >> n".txt" va ajouter (>>) chaque ligne dans un fichier texte appelé n.txt (où n est la première lettre).

Pour faire la même chose pour les deux premières lettres, changez simplement la longueur de substr:

gawk '{n=substr($1,0,2); print >> n".txt"}' file.txt

5
2018-02-02 19:39



Cool, c'est une bonne réponse aussi. +1! - Josiah
N'oublie pas de close() si ton awk trébuché avec "trop ​​de fichiers ouverts" erreur, par exemple gawk '{n=substr($1,0,2); print >> n".txt"; close(n".txt")}' file.txt - aff


#!/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

Le script ci-dessus prend le premier caractère de chaque ligne lue depuis le list.txt fichier. Il tente ensuite de créer un fichier avec ce caractère + ".txt", puis ajoute chaque ligne de list.txt au caractère approprié + fichier ".txt".


0
2018-02-03 14:17



Vous n'avez pas besoin de créer explicitement le fichier; la >> le créera s'il n'existe pas (sauf si noclobber a été défini, auquel cas le supprimer pour le script) - alexis
Non seulement vous n'avez pas besoin de le créer, mais vous ne le créez pas non plus. -e signifie vérifier si le fichier existe et que vous ne le ferez que touch le fichier si cela est vrai. Tout ce que vous faites est de modifier la date de création du fichier si le fichier existe. - terdon