web-dev-qa-db-fra.com

Conversion des lignes en colonnes du fichier

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.

16
yisha

À 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

Mais je pense que tu veux quelque chose comme ça?

 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.

21
αғsнιη

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
8
Avinash Raj

Vous pouvez également utiliser la commande fmt:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
8
fredtantini

Avec GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
7
cuonglm

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.

6
slm

À 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
5
jasonwryan

Utilisation d'une boucle for:

for val in `cat file1` ; do echo $val >> file2; done;
2
Mandar Shinde

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
0
Vaibhav Shetye

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
0
Sergiy Kolodyazhnyy

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
0
agc

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
0
Saumyakanta Sahoo