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.


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.

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.


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

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

7

Mit GNU Datamash :

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

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.


5

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

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

2

Verwenden einer forSchleife:

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

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

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

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.