it-swarm.com.de

Zeilen zur Spaltenkonvertierung der Datei

Angenommen, ich habe eine Datei:

Datei1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

Datei2 Ich möchte:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

Zeilen zur Spaltenkonvertierung von Datei1.

16
yisha

Ersetzen Sie mit tr jedes wiederholte Leerzeichen () durch eine einzelne neue Zeile (\n) Zeichen.

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

Aber ich denke du willst so etwas?

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

Mit awk könnten wir tun:

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

Dadurch wird jede Position der gleichen abgelegten Nummer zusammengefügt und in END wird das Ergebnis gedruckt, das die erste Zeile in der ersten Spalte, die zweite Zeile in der zweiten Spalte usw. wäre. Natürlich ist die Eingabedatei auf Ihre Speichergröße beschränkt.

21
αғsнιη

Sie können dies einfach über grep tun. Standardmäßig druckt grep die Übereinstimmung in einer separaten neuen Zeile.

grep -oP '\S+' infile > outfile

OR

grep -o '[^[:space:]]\+' infile > outfile
8
Avinash Raj

Sie können auch den Befehl fmt verwenden:

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

Mit GNU datamash :

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

Sie können dies auch mit sed tun:

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

HINWEIS : Behandelt nicht die Situation, in der die Wörter Leerzeichen enthalten.

6
slm

Setzen Sie mit awk das Ausgabefeldtrennzeichen (OFS) als Datensatztrennzeichen (RS):

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

Verwenden einer for -Schleife:

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

Sie können auch versuchen, sed zu verwenden

$ sed -i.bak [email protected]' '@'\n'@g infile.txt

Bitte beachten Sie, dass ich @ Als Trennzeichen für die Substitutionsoperation verwende. Dadurch wird auch eine Sicherungsdatei erstellt. Falls Sie kein Backup benötigen, entfernen Sie .bak

$ sed -i [email protected]' '@'\n'@g infile.txt
0
Vaibhav Shetye

Python-Version:

python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt

Dies verwendet die < - Umleitung von input.txt In Pythons Standard und schreibt mit output.txt In >. Der Einzeiler selbst liest alle Zeilen von stdin in eine Liste von Zeichenfolgen ein, in der alle Leerzeichen durch Zeilenumbrüche ersetzt werden, und wir erstellen den gesamten Text mit der Funktion .join() neu.

Ein alternativer Ansatz, um zu vermeiden, dass mehrere Leerzeichen in Reihen durch Zeilenumbrüche ersetzt werden, besteht darin, .split() zu verwenden, um die Zeile in eine Liste von Wörtern zu unterteilen. Auf diese Weise können wir sicherstellen, dass jedes Wort nur durch eine neue Zeile getrennt ist

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

Mit xargs, (gestohlen von Souravcs Antwort ):

xargs -n 1 < File1 > File2

Wenn eine geringfügige Neuformatierung erforderlich ist, verwenden Sie die Zeichenfolgen im Format printf, wie jedoch erforderlich:

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

Meine Lösung wäre:

#!/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
0