web-dev-qa-db-fra.com

Ligne à colonne et colonne à ligne à l'aide de awk

J'ai deux fichiers contenant comme ci-dessous

cat file1.txt
a b c 
1 2 3

cat file2.txt
a
b
c
1
2
3

Je veux que file1 soit arrangé comme

a
b
c
1
2
3

et file2 à organiser comme

a b c
1 2 3

Je voudrais une solution utilisant awk one line

11
user2949699

Une version awk

awk 1 RS=" |\n" file1  # gnu awk version
awk '{for (i=1;i<=NF;i++) print $i}' file1 # portable version
a
b
c
1
2
3


awk '{printf "%s" (NR%3==0?RS:FS),$1}' file2
a b c
1 2 3

printf "%s" # paramètre d'impression n ° 1 (1 $)
NR%3==0?"RS:FS # ajouter un formatage supplémentaire. Tester si la ligne est le numéro 3. Si ce n'est pas le cas, utilisez FS (un espace vide), s'il s'agit de RS, une nouvelle ligne.
Ceci ajuste donc le paramètre suivant toutes les 3 lignes.

5
Jotne

J'utiliserais xargs pour ceci: 

$ xargs -n1 < file1
a
b
c
1
2
3

$ xargs -n3 < file2
a b c
1 2 3
10
Chris Seymour

L’approche awk idiomatique consistant simplement à définir le paramètre OFS ou ORS sur FS ou RS selon les besoins avant d’imprimer (et de recompiler l’enregistrement si nécessaire avec $1=$1) fonctionnera avec tout type awk:

$ cat file1
a b c
1 2 3
$ awk '{OFS=RS;$1=$1}1' file1
a
b
c
1
2
3
$ cat file2
a
b
c
1
2
3
$ awk '{ORS=(NR%3?FS:RS)}1' file2
a b c
1 2 3
5
Ed Morton

Pour votre premier fichier, vous pouvez essayer quelque chose comme:

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

Pour votre deuxième fichier, vous pouvez essayer quelque chose comme:

awk 'BEGIN {str=""; i=1} {if(i%3 == 0){str=str""$0"\n"} else {str=str""$0" "} i++} END {print str}' file2.txt

Cependant, je ferais des hypothèses telles que les trois lignes entières doivent sauter une ligne dans la sortie, par exemple. Nous aurions besoin de plus de détails je pense ...

0
Idriss Neumann