Supponiamo di avere un file:
file1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 Voglio:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Conversione delle righe in colonne di File1.
Supponiamo di avere un file:
file1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 Voglio:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Conversione delle righe in colonne di File1.
Risposte:
Usando tr
, sostituisci ogni carattere di spazio ripetuto ( ) con un singolo carattere di nuova riga (
\n
).
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ 4 d%
Con awk
potremmo fare:
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
Ciò unisce insieme lo stesso numero di file positivo e in END
stampa il risultato che sarebbe la prima riga nella prima colonna, la seconda riga nella seconda colonna, ecc. Naturalmente il file di input è limitato alle dimensioni della memoria.
Potresti semplicemente farlo tramite grep. Per impostazione predefinita grep, stampa la corrispondenza in una nuova riga separata.
grep -oP '\S+' infile > outfile
O
grep -o '[^[:space:]]\+' infile > outfile
grep
Puoi anche usare il fmt
comando:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Con datamash GNU :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
sembra lo strumento migliore per l'attività, ma affascinante quanti altri strumenti potrebbero essere utilizzati!
Puoi anche farlo usando sed
:
$ sed -e 's/ */\n/g' file1 > file2
NOTA: non gestisce la situazione in cui le parole contengono spazi.
\n
come newline
Usando awk
, impostando il separatore di campo di output ( OFS
) come separatore di record (riga) ( RS
):
awk '{OFS=RS;$1=$1}1' file > file2
Utilizzando un for
loop:
for val in `cat file1` ; do echo $val >> file2; done;
Puoi anche provare a usare sed
$ sed -i.bak s@' '@'\n'@g infile.txt
Si noti che sto usando @
come separatore per l'operazione di sostituzione. Ciò creerà anche un file di backup. Nel caso in cui non sia necessario un backup, rimuovere .bak
$ sed -i s@' '@'\n'@g infile.txt
Versione Python:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
Questo utilizza il <
reindirizzamento nello stdin di Python input.txt
e scrive output.txt
usando il >
reindirizzamento. Lo stesso one-liner legge tutte le righe stdin
in un elenco di stringhe, in cui tutti gli spazi vengono sostituiti con nuove righe e ricostruiamo l'intero testo usando.join()
funzione.
Un approccio alternativo per evitare che più spazi in serie vengano sostituiti con nuove righe è quello di utilizzare la .split()
linea di interruzione nell'elenco delle parole. In questo modo, possiamo garantire che ogni parola sia separata da una sola riga
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
Usando xargs
, (rubato da risposta di souravc ):
xargs -n 1 < File1 > File2
O se è necessaria una riformattazione minore, utilizzare le printf
stringhe di formato come potrebbero essere necessarie:
xargs printf '%s\n' < File1 > File2
La mia soluzione sarebbe:
#!/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