Supposons que j'ai un fichier:
Fichier1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 je veux:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Conversion des lignes en colonnes de File1.
À l'aide de tr
, remplacez chaque caractère d'espace répété () par une seule nouvelle ligne (\n
) personnage.
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # A b c d -> 2 b $ # $ @% 3 c @ 4 d%
Avec awk
nous pourrions faire:
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) }
END{ for (i in RtoC) print RtoC[i] }' infile
Cela joint chaque même position de numéro de fichier dans ensemble et dans END
imprime le résultat qui serait la première ligne dans la première colonne, la deuxième ligne dans la deuxième colonne, etc. Bien sûr, le fichier d'entrée est limité à votre taille de mémoire.
Vous pouvez simplement le faire via grep. Par défaut, grep afficherait la correspondance dans une nouvelle ligne distincte.
grep -oP '\S+' infile > outfile
OR
grep -o '[^[:space:]]\+' infile > outfile
Vous pouvez également utiliser la commande fmt
:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Avec GNU datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Vous pouvez également le faire en utilisant sed
:
$ sed -e 's/ */\n/g' file1 > file2
REMARQUE: Ne gère pas la situation où les mots contiennent des espaces.
À l'aide de awk
, définissez le séparateur de champ de sortie (OFS
) comme séparateur d'enregistrement (ligne) (RS
):
awk '{OFS=RS;$1=$1}1' file > file2
Utilisation d'une boucle for
:
for val in `cat file1` ; do echo $val >> file2; done;
Vous pouvez également essayer d'utiliser sed
$ sed -i.bak s@' '@'\n'@g infile.txt
Veuillez noter que j'utilise @
comme séparateur pour l'opération de substitution. Cela créera également un fichier de sauvegarde. Si vous n'avez pas besoin d'une sauvegarde, supprimez .bak
$ sed -i s@' '@'\n'@g infile.txt
Version Python:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
Cela utilise la redirection <
Dans le stdin de python à partir de input.txt
Et écrit dans output.txt
En utilisant la redirection >
. Le one-liner lui-même lit dans toutes les lignes de stdin
dans une liste de chaînes, où tous les espaces sont remplacés par des retours à la ligne, et nous reconstruisons le texte entier en utilisant la fonction .join()
.
Une approche alternative pour éviter le remplacement de plusieurs espaces en série par des sauts de ligne consiste à utiliser .split()
pour briser la ligne en liste de mots. De cette façon, nous pouvons nous assurer que chaque mot n'est séparé que par une nouvelle ligne
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
En utilisant xargs
, (volé à réponse de souravc ):
xargs -n 1 < File1 > File2
Ou si un reformatage mineur est nécessaire, utilisez des chaînes de format printf
comme cela pourrait être nécessaire:
xargs printf '%s\n' < File1 > File2
Ma solution serait:
#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done