lire dans bash sur un fichier délimité par des tabulations sans effondrement de champs vides
Je suis en train de lire plusieurs lignes séparées par des tabulations fichier bash. Le format est telle que les champs vides sont attendus. Malheureusement, la coquille s'effondre ensemble séparateurs de champ qui sont à côté les uns des autres, de la manière suivante:
# IFS=$'\t'
# read one two three <<<$'one\t\tthree'
# printf '<%s> ' "$one" "$two" "$three"; printf '\n'
<one> <three> <>
...plutôt que le résultat désiré de <one> <> <three>
.
Cela peut-il être résolu sans avoir recours à une autre langue (comme awk)?
source d'informationauteur Charles Duffy
Vous devez vous connecter pour publier un commentaire.
Voici une approche avec quelques subtilités:
Le code.
file_data
etfile_input
sont juste pour la génération d'entrée, comme si à partir d'une commande externe appelé par le script.data
etcols
pourrait être paramétrés pour leget
etput
appels, etc, mais ce script ne va pas aussi loin.De sortie:
Sûr
J'ai réorganisé l'exemple de juste un peu, mais seulement pour le faire fonctionner dans tout le shell Posix.
Mise à jour: Ouais, il semble que l'espace blanc est spécial, au moins si c'est en IFS. Voir la deuxième moitié de ce point de bash(1):
Il n'est pas nécessaire d'utiliser
tr
mais il est nécessaire queIFS
est un caractère non-blanc (sinon multiples obtenir effondrée pour les célibataires comme vous l'avez vu).Voici un rapide et simple de la fonction j'utilise ça évite d'appel de programmes externes ou la limitation de la plage de caractères d'entrée. Il fonctionne en bash uniquement (je suppose).
Si c'est pour permettre plus de variables que de champs, cependant, il doit être modifié, le long de la Charles Duffy réponse.
J'ai écrit une fonction qui fonctionne autour de cette question. Cette mise en oeuvre particulière est particulier à propos de l'onglet séparées par des colonnes et des retour à la ligne séparées par des lignes, mais cette limitation peut être enlevé comme un exercice simple:
D'utilisation comme suit: