Zeilen zur Spaltenkonvertierung der Datei

15

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 File1.

Yisha
quelle
Wenn Ihre Datei aus mehr als einer Zeile besteht und Ihre Ausgabe daher mehr als eine Spalte haben sollte, versuchen Sie dieses AWK-Skript .
Bis auf weiteres angehalten.
Sehr ähnliche Frage: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

Antworten:

20

Unter Verwendung trjedes wiederholtes Leerzeichen (Ersetzen ) mit einem einzigen neuer Linie ( \n) Charakter.

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

Aber ich denke du willst so etwas?

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

Mit awkkö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

Dies fügt die gleiche Feldnummerposition zusammen und gibt ENDdas Ergebnis aus, das die erste Zeile in der ersten Spalte, die zweite Zeile in der zweiten Spalte usw. sein würde. Natürlich ist die Eingabedatei auf Ihre Speichergröße beschränkt.

αғsнιη
quelle
Ich habe es mit den gleichen Daten und dem gleichen Code versucht, es hat die letzte Spalte als ersten Datensatz wie 4 d% und dann den zweiten Datensatz 1 a # und so weiter gedruckt.
Abhinay
8

Sie könnten dies einfach durch grep tun. Standardmäßig würde grep die Übereinstimmung in einer separaten Zeile ausgeben.

grep -oP '\S+' infile > outfile

ODER

grep -o '[^[:space:]]\+' infile > outfile
Avinash Raj
quelle
1
+1 für die kreative Nutzung vongrep
Volker Siegel
8

Sie können auch den folgenden fmtBefehl verwenden:

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

Mit GNU Datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
cuonglm
quelle
datamashscheint das beste Werkzeug für diese Aufgabe zu sein, aber faszinierend, wie viele andere Werkzeuge verwendet werden könnten!
Mark Stewart
6

Sie können dies auch tun mit sed:

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

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

slm
quelle
5

Verwenden Sie awk, um das Ausgabefeld-Trennzeichen ( OFS) als Datensatz- (Zeilen-) Trennzeichen ( RS) festzulegen :

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

Verwenden einer forSchleife:

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

Sie können es auch mit versuchen sed

$ sed -i.bak s@' '@'\n'@g infile.txt

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

$ sed -i s@' '@'\n'@g infile.txt
Vaibhav Shetye
quelle
0

Python-Version:

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

Dies nutzt < Umleitung in Pythons stdin von input.txtund schreibt in output.txtdie >Umleitung. Der Einzeiler selbst liest alle Zeilen von stdinin eine Liste von Zeichenfolgen ein, in der alle Leerzeichen durch Zeilenumbrüche ersetzt werden, und wir erstellen den gesamten Text mithilfe von neu.join() Funktion neu.

Ein alternativer Ansatz, um zu vermeiden, dass mehrere Leerzeichen in einer Reihe durch Zeilenumbrüche ersetzt werden, besteht darin .split(), 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 wird

python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
Sergiy Kolodyazhnyy
quelle
0

Mit xargs, (aus souravcs Antwort gestohlen ):

xargs -n 1 < File1 > File2

Oder wenn eine geringfügige Neuformatierung erforderlich ist, verwenden Sie printfFormatzeichenfolgen, wie auch immer erforderlich sein mag:

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

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
Saumyakanta Sahoo
quelle
-1
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2
Narmatha
quelle