J'ai deux variables qui contiennent des informations multilignes et je veux les colonnes.
varA
retourne
Aug 01
Aug 04
Aug 16
Aug 26
et varB
retourne
04:25
07:28
03:39
10:06
si j'imprime les deux variables, il retourne
Aug01
Aug04
Aug16
Aug26
04:25
07:28
03:39
10:06
Ce que je veux faire est le suivant:
Aug01 04:25
Aug04 07:28
Aug16 03:39
Aug26 10:06
Je suis nouveau dans Linux et j'apprécierais quelques conseils, merci.
Rencontrez paste
name__, composant du programme préinstallé tilitaires principaux GN :
$ paste <(printf %s "$varA") <(printf %s "$varB")
Aug 01 04:25
Aug 04 07:28
Aug 16 03:39
Aug 26 10:06
paste
prend des fichiers et non des variables en entrée. J'ai donc utilisé bash
Process Substitution et viens d'imprimer le contenu de la variable avec printf
name__. Le délimiteur par défaut entre les colonnes est TAB
name__, vous pouvez le modifier avec l’option -d
, par exemple. paste -d" "
pour un caractère d'espacement unique. Pour en savoir plus sur paste
name__, consultez le manuel en ligne ou exécutez info '(coreutils) paste invocation'
.
Si vous voulez simplement afficher les variables de texte côte à côte, @dessert a la solution la plus simple (la meilleure?) En utilisant print
. Cependant, si vous voulez pouvoir manipuler chaque pièce individuellement, vous pouvez facilement convertir les vars en tableaux, et les parcourir en boucle.
#!/bin/bash
# declare the multi-line variables
var1="1
2
3
4"
var2="a
b
c
d"
# backup internal field separator to be safe
IFSave=$IFS
# set IFS to newline so vars will use newline to split into array
IFS=$'\n'
# split variables into array
foo=($var1)
bar=($var2)
#restore IFS to original value to be safe
IFS=$IFSave
# loop array foo, and cross reference key in array bar
for i in "${!foo[@]}"; do
printf "${foo[$i]} : ${bar[$i]}\n"
done
# you can allso now print single corresponding lines:
line=3
let id=$line-1 # arrays start at 0, so need to remove one
printf "\nPrinting line number $line\n"
printf "${foo[$id]} : ${bar[$id]}\n"
Vous pouvez le faire avec l'outil POSIX pr
:
varA='Aug 01
Aug 04
Aug 16
Aug 26'
varB='04:25
07:28
03:39
10:06'
pr -2 -t <<eof
$varA
$varB
eof
Résultat:
Aug 01 04:25
Aug 04 07:28
Aug 16 03:39
Aug 26 10:06
Ou pour un seul onglet:
pr -2 -t -s
Ou pour un seul espace:
pr -2 -t -s' '
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/pr.html
Ou avec column
du package util-linux
:
column -c 20 <<eof
$varA
$varB
eof
Si vous voulez éviter les utilitaires externes et le faire en mode natif dans le shell, vous pouvez utiliser read
avec des descripteurs de fichier/chaînes séparés pour chaque variable:
while IFS= read -r -u3 a && read -r -u4 b; do
printf '%s\t%s\n' "$a" "$b"
done 3<<<"$varA" 4<<<"$varB"
Aug 01 04:25
Aug 04 07:28
Aug 16 03:39
Aug 26 10:06
Bien qu'il soit souvent considéré comme une mauvaise pratique d'utiliser Shell pour le traitement de texte, il peut être excusé dans le cas où vous avez déjà les données dans des variables Shell.