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.