Come convertire da riga a colonna?


11

Ho un file .txt con numeri ordinati in questo modo (sulla stessa riga):

106849_01373    106849_01967    106850_00082    23025.7_01059   

Vorrei convertirli in quel modo:

106849_01373
106849_01967
106850_00082
23025.7_01059

Non ho idea di quale comando usare. Qualcuno può aiutarmi con questo?

Risposte:


5

Eccone uno con xargs

xargs -n1 < file.txt

demo:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs è un ottimo strumento, e se non lo avessi menzionato, lo avrei fatto, ma ha uno svantaggio in quanto se ometti il ​​comando sostituisce l'eco (che a differenza di alcune shell, xargs non ha un eco incorporato) e -n1 dice a xargs di chiamare il comando per ogni arg, quindi con questo esempio avresti un minimo di sei processi coinvolti (la shell per fare il reindirizzamento io, xargs e quattro echi). Questo non è così male in questo ambito, ma è misurabile in modo più lento all'uscita di un paio di migliaia di righe.
— Hildred

16

Abbastanza facile con tr:

tr -s '[:blank:]' '\n' <file.txt

Esempio:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

La risposta di heemayl è la strada da percorrere, tuttavia ecco un'alternativa usando Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: abilita l'elaborazione automatica della fine della linea. Ha due effetti separati. Innanzitutto, chomps $ / (il separatore del record di input) automaticamente se usato con -n o -p. In secondo luogo, assegna $ \ (il separatore del record di output) per avere il valore di ottnum in modo che tutte le istruzioni di stampa abbiano quel separatore aggiunto nuovamente. Se l'ottetto viene omesso, imposta $ \ sul valore corrente di $ /.
  • -a: attiva la modalità autosplit quando usato con a -n o -p. Un comando di divisione implicita nell'array @F viene eseguito come prima cosa all'interno del ciclo while implicito prodotto da -n o -p.
  • -n: fa sì che Perl assuma il seguente ciclo attorno al programma, il che lo fa iterare su argomenti di file un po 'come sed -n o awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: può essere utilizzato per inserire una riga di programma;

  • $,="\n": imposta il separatore del campo di output su una nuova riga;
  • print(@F): stampa i campi separati dal separatore del campo di output.
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKapproccio. Fondamentalmente cambiando il separatore di output per i campi e il looping. Il file di test è il tuo esempio incollato più volte con ENDLINE alla fine

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

Utilizzando sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

Non del tutto ... aggiungerebbe una nuova riga finale dopo ogni riga (iniziale) ...
— heemayl

Controlla con più righe, otterrai un caso chiaro quindi ...
— heemayl

Potresti aggiungere un esempio con la tua risposta ..
— heemayl

@heemayl Volevi dire che avrebbe trasformato gli spazi finali in newline. La tua sintassi non semplifica la comprensione. : /
— techraf

1

Aggiungo semplicemente una soluzione Python per divertimento:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

Questo comando esegue lo script Python 3 a riga singola in "virgolette singole" con il nome del file che si desidera convertire come argomento alla fine. La sintassi è così:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

Lo script a 1 riga che utilizziamo è questo (esteso a più righe per maggiore chiarezza):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

Importa il sysmodulo per leggere gli argomenti della riga di comando, accetta il primo argomento dato come nome file per aprirlo e stampa ogni blocco di dati separato da spazi bianchi dal file in una singola riga.

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
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.