Conversione delle righe in file del file


15

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.


Se il tuo file è composto da più di una riga e il tuo output dovrebbe quindi avere più di una colonna, prova questo script AWK .
In pausa fino a ulteriore avviso.

Risposte:


20

Usando tr, sostituisci ogni carattere di spazio ripetuto ( ) con un singolo carattere di nuova riga ( \n).

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

Ma penso che tu voglia qualcosa del genere?

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

Con awkpotremmo 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 ENDstampa 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.


Ho provato con gli stessi dati e codice, ha stampato l'ultima colonna del primo record come il 4 d% e poi il secondo record 1 a # e così via.
Abhinay,

8

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

1
+1 per l'uso creativo digrep
Volker Siegel,

8

Puoi anche usare il fmtcomando:

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

7

Con datamash GNU :

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

datamashsembra lo strumento migliore per l'attività, ma affascinante quanti altri strumenti potrebbero essere utilizzati!
Mark Stewart,

6

Puoi anche farlo usando sed:

$ sed -e 's/  */\n/g' file1 > file2

NOTA: non gestisce la situazione in cui le parole contengono spazi.


Ciò richiede GNU sed, per quanto posso dire. Quello fornito con mac (BSD) non vede \ncome newline
D. Ben Knoble

5

Usando awk, impostando il separatore di campo di output ( OFS) come separatore di record (riga) ( RS):

awk '{OFS=RS;$1=$1}1' file > file2

2

Utilizzando un forloop:

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

0

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

0

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.txte scrive output.txtusando il >reindirizzamento. Lo stesso one-liner legge tutte le righe stdinin 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

0

Usando xargs, (rubato da risposta di souravc ):

xargs -n 1 < File1 > File2

O se è necessaria una riformattazione minore, utilizzare le printfstringhe di formato come potrebbero essere necessarie:

xargs printf '%s\n' < File1 > File2

0

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

-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.