web-dev-qa-db-fra.com

Boucle sur les champs de saisie sous forme de tableau

Est-il possible de faire quelque chose comme ça:

$ cat foo.txt
1 2 3 4
foo bar baz
hello world
$ awk '{ for(i in $){ print $[i]; } }' foo.txt
1
2
3
4
foo
bar
baz
hello
world

Je sais que tu pourrais faire ça:

$ awk '{ split($0,array," "); for(i in array){ print array[i]; } }' foo.txt
2
3
4
1
bar
baz
foo
world
hello

Mais alors le résultat n'est pas correct.

23
Tyilo

Découvert moi-même:

$ awk '{ for(i = 1; i <= NF; i++) { print $i; } }' foo.txt
51
Tyilo

Pas besoin de awk, sed ou Perl. Vous pouvez facilement le faire directement dans Shell:

for i in $(cat foo.txt); do echo "$i"; done
2
Sven Marnach

J'utiliserais sed:

sed 's/\ /\n/g' foo.txt
1
dala

Si vous êtes prêt à utiliser Perl, l'un ou l'autre devrait faire l'affaire:

Perl -lane 'print $_ for @F' foo.txt
Perl -lane 'print join "\n",@F' foo.txt

Ces options de ligne de commande sont utilisées: 

  • -n boucle autour de chaque ligne du fichier d'entrée, ne pas imprimer automatiquement la ligne
  • -l supprime les nouvelles lignes avant le traitement et les rajoute après 
  • -a mode autosplit - divise les lignes d’entrée dans le tableau @F. La valeur par défaut est la division sur les espaces blancs. 
  • -e exécuter le code Perl 
0
Chris Koknat