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.
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.
Réponses:
À 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
1 2 3 4 1 a # abcd -> 2 milliards $ # $ @% 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
Ceci joint chaque même position de numéro déposé dans et 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é à la taille de votre 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
OU
grep -o '[^[:space:]]\+' infile > outfile
grep
Vous pouvez également utiliser la fmt
commande:
~$ 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
datamash
semble être le meilleur outil pour la tâche, mais fascinant combien d'autres outils pourraient être utilisés!
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.
\n
comme une nouvelle ligne
À 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
Utiliser une for
boucle:
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 à l' output.txt
aide de 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 .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
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 printf
chaînes de format 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