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.
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.
Antworten:
Unter Verwendung tr
jedes wiederholtes Leerzeichen (Ersetzen ) mit einem einzigen neuer Linie (
\n
) Charakter.
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 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
Dies fügt die gleiche Feldnummerposition zusammen und gibt END
das 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.
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
grep
Sie können auch den folgenden fmt
Befehl verwenden:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
Mit GNU Datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
scheint das beste Werkzeug für diese Aufgabe zu sein, aber faszinierend, wie viele andere Werkzeuge verwendet werden könnten!
Verwenden Sie awk
, um das Ausgabefeld-Trennzeichen ( OFS
) als Datensatz- (Zeilen-) Trennzeichen ( RS
) festzulegen :
awk '{OFS=RS;$1=$1}1' file > file2
Verwenden einer for
Schleife:
for val in `cat file1` ; do echo $val >> file2; done;
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
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.txt
und schreibt in output.txt
die >
Umleitung. 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 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
Mit xargs
, (aus souravcs Antwort gestohlen ):
xargs -n 1 < File1 > File2
Oder wenn eine geringfügige Neuformatierung erforderlich ist, verwenden Sie printf
Formatzeichenfolgen, wie auch immer erforderlich sein mag:
xargs printf '%s\n' < File1 > File2
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