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.


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.

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.


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

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

7

Avec GNU datamash :

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

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.


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

2

Utiliser une forboucle:

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

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

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

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.