Conversion des lignes en colonnes du fichier

15

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.

yisha
la source
Si votre fichier se compose de plusieurs lignes et que votre sortie doit donc avoir plusieurs colonnes, essayez ce script AWK .
pause jusqu'à nouvel ordre.
Question très connexe: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

Réponses:

20

À l'aide de tr, remplacez chaque caractère d'espace répété ( ) par un seul caractère de nouvelle ligne ( \n).

tr -s ' '  '\n'< infile > outfile

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

1 2 3 4 1 a #
abcd -> 2 milliards $
# $ @% 3 c @
                4 d%

Avec awknous 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

Ceci joint chaque même position de numéro déposé dans et ENDimprime 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é à la taille de votre mémoire.

αғsнιη
la source
J'ai essayé avec les mêmes données et le même code, il a imprimé la dernière colonne comme premier enregistrement comme 4 d% et ensuite le deuxième enregistrement 1 a # et ainsi de suite.
Abhinay
8

Vous pouvez simplement le faire via grep. Par défaut, grep afficherait la correspondance dans une nouvelle ligne distincte.

grep -oP '\S+' infile > outfile

OU

grep -o '[^[:space:]]\+' infile > outfile
Avinash Raj
la source
1
+1 pour une utilisation créative degrep
Volker Siegel
8

Vous pouvez également utiliser la fmtcommande:

~$ cat f
PAPER  TEAM  MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
fredtantini
la source
7

Avec GNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
cuonglm
la source
datamashsemble être le meilleur outil pour la tâche, mais fascinant combien d'autres outils pourraient être utilisés!
Mark Stewart
6

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.

slm
la source
Cela nécessite GNU sed, autant que je sache. Celui qui est livré avec mac (BSD) n'est pas considéré \ncomme une nouvelle ligne
D. Ben Knoble
5

À 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
jasonwryan
la source
2

Utiliser une forboucle:

for val in `cat file1` ; do echo $val >> file2; done;
Mandar Shinde
la source
0

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

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.txtet écrit à l' output.txtaide de la >redirection. Le one-liner lui-même lit dans toutes les lignes de stdindans 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 .join()fonction.

Une approche alternative pour éviter que plusieurs espaces en série ne soient remplacés par des retours à la ligne consiste .split()à séparer 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
Sergiy Kolodyazhnyy
la source
0

En utilisant xargs, (volé de la réponse de souravc ):

xargs -n 1 < File1 > File2

Ou si un reformatage mineur est nécessaire, utilisez des printfchaînes de format comme cela pourrait être nécessaire:

xargs printf '%s\n' < File1 > File2
agc
la source
0

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
Saumyakanta Sahoo
la source
-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Narmatha
la source