Ceci est pour une application de science des données numériques. J'ai besoin de créer une matrice de zéros, dans un fichier, séparés par des virgules (dans une ligne) et se terminant par une nouvelle ligne (à la fin de chaque ligne). Ce code bash était le plus proche:

l=`python -c "print(f'{\"0, \" * 9}0')"`  # 10 zeros comma separated in one line
yes $l | head -n 3  # print line 3 times
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0

C'est très bien, jusqu'à ce que vous essayiez de changer les deux littéraux 9 et 3 en variables shell. Cependant, il est difficile (pour moi) de le coder correctement pour remplacer le littéral 9 par une variable shell n = 9. J'ai essayé d'utiliser bash et python mais ne fonctionne toujours pas. Par exemple, ces deux tentatives différentes ne fonctionnent pas réellement (pour moi) avec des variables:

l=$(printf '0,%.0s' {1..$((n-1))}; printf '0')  # 100% bash code
yes $l | head -n $k  # print line 3 times
0,0
0,0
0,0

l=`python -c "print(f'{\"0, \" * 9}0')"`  # using a bit of python, 10 literal zeros comma separated in one line
yes $l | head -n 3  # print line 3 times
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Dans ce cas, changer le littéral 9 en variable dans le python était encore pire et m'a donné quelque chose de fou, comme une sorte de liste de répertoires, dont je ne veux certainement pas.

0
Geoffrey Anderson 2 juin 2020 à 21:05

3 réponses

Meilleure réponse

Juste une légère variation sur votre approche:

n=10
k=3
yes "$(yes 0 | head -n "$n" | paste -s -d,)" | head -n "$k"

Et si des espaces après les virgules sont nécessaires, un piping vers sed 's/,/, /g' le fera.

3
Benjamin W. 2 juin 2020 à 18:16

Désolé de répondre à ma propre question, mais comme cela arrive souvent, j'ai trouvé une bonne réponse peu de temps après la publication! Je viens de combiner quelques autres réponses SO ensemble. Merci d'avance pour les autres personnes qui trouvent quelque chose de plus simple que le mien, comme toujours.

Cela fonctionne correctement:

export n
yes `python -c "import os; n=int(os.environ['n']); print(f'{\"0.0, \" * n}0.0')"` | head -n $k
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0

Cela pourrait encore aider d'autres programmeurs numériques à mon avis.

0
Geoffrey Anderson 2 juin 2020 à 18:20

En pure bash:

#!/usr/bin/env bash
cols=$1
rows=$2
declare -a row
for ((i = 0; i < cols; i++)); do
    row+=(0)
done
IFS=, line="${row[*]}"
for ((i = 0; i < rows; i++)); do
    echo "$line"
done

Exemple:

$ ./demo.sh 10 3
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0
2
Shawn 2 juin 2020 à 18:18